title: “Docker入门”
author:
- imshixin
keywords: [Docker]
abstract: “docker入门”
[toc]
Docker安装
Docker仅在linux内核3.08及以上版本运行,使用uname -a
检查当前linux系统内核版本
ubuntu安装教程可参考这篇文章
centos7可参考这篇文章
使用下面这个命令检查是否安装成果
1 | sudo docker info |
替换默认镜像源
1 | echo "{"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]}" >> /etc/docker/daemon.json |
将该命令执行可以更换docker镜像源,提高pull速度
Docker 镜像操作
搜索镜像
1 | sudo docker search [image] |
添加
--limit n
限制显示条目为n条
比如输入sudo docker search ubuntu
1 | [root@localhost ~]# docker search ubuntu |
查看镜像的不同TAG
打开Docker Hub,搜索想查找的仓库,点开Tag页面便可看到该仓库源的所有TAG
我知道的目前只有这样子了
下载镜像
1 | docker pull [OPTIONS] NAME[:TAG|@DIGEST] |
参数:
- -a 下载该仓库的所有镜像(原文:Download all tagged images in the repository)
- -q 静默下载
例如拉取ubuntu:16.10
,:
后面的内容代表版本,也称为标签,不写的话默认会是latest
,代表最新版本
1 | sudo docker pull ubuntu:16.10 |
查看下载的镜像
1 | sudo docker images [OPTIONS] [REPOSITORY[:TAG]] |
使用-q
参数让该命令只输出镜像id
删除镜像
1 | docker rmi [OPTIONS] IMAGE [IMAGE...] |
使用-f
强制删除镜像
若想要删除所有镜像,可使用
1 sudo docker rmi `docker images -q`
Docker容器使用
启动一个容器
使用如下命令运行一个容器
1 | sudo docker run [options] [image:tag] [command] |
image[:tag]
代表想要运行的镜像名 command
代表启动容器后要运行的命令
若本地没有所需镜像,docker会自动从docker hub上拉取
常用参数有
-t 为该容器分配一个伪终端(tty),与
-i
搭配使用-i 保持该容器的标准输入stdin打开,与-t搭配使用
-d 使该容器在后台运行,并返回一个容器id
–name 为容器分配一个名称,不指定本参数docker将会随机生成一个
-p 指定端口转发
- -p 80 将容器的80端口随机绑定(映射)到主机端口
- -p 8080:80 将容器的80端口映射到主机的8080端口
- -p ip:hostPort 将容器的端口绑定到主机指定的ip和一个随机端口
- -p ip:hostPort:conPort 将容器conPort绑定的主机的ip:hostPort
-P 将容器内部开放的所有端口随机分配到主机端口
内部开放指构建时Dockerfile文件中EXPOSE的所有端口
启动一个Ubuntu16.10容器命名为hello并进入
1 | [root@localhost ~]# docker run -it --name hello ubuntu:16.10 /bin/bash |
可以看到主机名变成了容器idc8e790d88ca0
执行命令后进入容器终端,
exit
退出终端后容器也会随之停止
启动一个nginx容器开放80端口并后台运行
1 | sudo docker run -d --name static_web -p 80 nginx /bin/sh -c 'nginx daemon off;' |
让容器自动重启
通过在启动容器时添加--restart
参数使容器停止时自动重启,--restart=always
会让容器停止时始终自动重启,--restart=on-failure:5
可让容器退出码非0时重启至多5次
重启并进入容器
容器执行完命令后,将会自动停止,如果我们想再次启动,可以使用下面的命令重启:
1 | sudo docker start [OPTIONS] CONTAINER [CONTAINER...] |
重启时的容器会再次执行docker run
中使用的命令,对hello容器而言就是/bin/bash
若想要重启后进入容器,可添加-a
参数进入容器的命令提示符
附加到容器
容器重启后,并不会直接进入容器,需要执行额外命令进入容器
1 | sudo docker attach [OPTIONS] CONTAINER |
同样的,在退出容器shell后,容器将会停止
如何进入容器终端并退出容器后不让容器停止呢
执行容器命令
我们可以使用exec命令让指定容器执行命令:
1 | sudo docker exec [OPTIONS] CONTAINER COMMAND [ARG...] |
该命令与docker run
具有类似用法,使用docker exec -it CONTAINER /bin/bash
进入容器命令提示符,也可添加-d
参数来后台执行命令
通过该命令进入容器的shell退出后,容器并不会停止,因此,更推荐用这个命令进入容器
打印容器的输出
若想要查看容器输出了什么东西,或者容器异常停止,想要查看报错信息:
1 | sudo docker logs [OPTIONS] CONTAINER |
参数:
- -f 持续性的输出容器内容,类似
tail -f
- -n 仅输出最后n行内容,类似
tail
命令 - -t 显示时间戳
查看容器内的进程
可以通过sudo docker exec -it CONTAINER /bin/bash
进入容器后使用top
之类的程序查看容器进程,也可以:
1 | sudo docker top CONTAINER |
打印容器信息
获取容器的更多配置信息:
1 | sudo docker inspect [OPTIONS] NAME|ID [NAME|ID...] |
Docker容器管理
查看正在运行的容器
执行以下命令显示正在运行的命令
1 | sudo docker ps [OPTIONS] |
参数:
- -a 显示所有容器,包括已停止的容器
- -l 仅显示最近创建的容器
- -q 仅输出容器的id
- -s 显示容器文件大小
1 | [root@localhost ~]# docker ps |
停止正在运行的容器
1 | docker stop [OPTIONS] CONTAINER [CONTAINER...] |
参数:-t
发送停止命令后等待的最大秒数,默认为10秒
删除已停止的容器
想要删除容器时:
1 | docker rm [OPTIONS] CONTAINER [CONTAINER...] |
参数:
- -f 强制删除一个正在运行的容器
- -l 移除特殊链接
- -v 移除任何相关联的卷
删除所有容器:
1 sudo docker rm `docker ps -aq`
DockerHub以及镜像构建
Docker Hub:https://hub.docker.com/
注册docker hub 后,使用如下命令登录
1 | sudo docker login |
构建并上传镜像
当我们对容器做出修改,想要打包上传修改好的镜像时,可以使用(不推荐)
1 | docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] |
参数:
- -a 作者
- -m 修改信息
- -p [true|false] 上传时暂定容器(默认为true)
例如,用sudo docker commit hello yuy/hello
将hello容器上传到yuy用户下的hello仓库中,且当前TAG为latest
用Dockerfile构建镜像
新建一个目录,记为工作目录,进去新建一个文件,名为Dockerfile
1 | [root@localhost doc]# mkdir static__web |
编辑这个文件
1 | FROM ubuntu:16.10 |
各命令解释,Docker大致按如下流程执行
FROM 指定一个基础镜像,docker 生成一个此镜像的容器
MAINTAINER 此镜像的拥有者以及邮箱
RUN 在上一步生成的容器中执行RUN后面命令,并生成一个镜像,用该镜像运行新的容器,指令将会用/bin/sh -c
包裹,使用RUN ["apt-get","install","-y","nginx"]
将不会用shell包裹,因此RUN有两种写法
RUN COMMAND
RUN [COMMAND,...]
EXPOSE 期望暴露的端口,需要在docker run -p
时指定要暴露的端口才会真正暴露,docker run -P
将会把dockerfile中所有期望暴露的端口随机绑定到主机
1 | [root@localhost static__web]# docker build -t imshixin/static__web . |