docker常用命令
系统环境:CentOS7-1804
docker版本:18.09.6
docker服务使用只要版本相同,命令就是一样;除非是部分系统服务控制命令,不同系统稍有偏差.
默认镜像仓库地址为docker.io,可以通过/etc/docker/daemon.json 文件来修改默认镜像仓库地址. 例如:以下操作为将docker镜像仓库地址修改为国内镜像源.
echo '{"registry-mirrors":["https://registry.docker-cn.com"]}' > /etc/docker/daemon.json
systemctl restart docker
拉取镜像,通过pull拉取一个名为nginx的镜像到本地.如果不加镜像地址和版本号,默认从docker默认的仓库地址下载,镜像版本为latest
docker pull nginx
查看拉取的镜像
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 719cd2e3ed04 2 days ago 109MB
删除镜像,通过rmi删除指定镜像,可以指定具体镜像名称:版本来删除,也可以通过IMAGE ID来删除.如果删除的镜像被某个容器所使用,则无法删除.需要先删除正在使用该镜像的容器,再删除该镜像.
# dokcer rmi 719cd2e3ed04
通过镜像运行一个容器,run 表示运行, -d 在后台运行, --name 给运行的容器取一个名称, 最后面为镜像名称+版本,不指定版本则默认使用latest
# docker run -d --name test-nginx nginx
db1b5cf1583f68a520719709e0be460cd7c2556395f7b94fe4da936683078f6a
查看刚才运行的容器,ps 列出本机所有正在运行的容器,-a 列出本机所有容器,包括已经停止的容器
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db1b5cf1583f nginx "nginx -g 'daemon of…" 6 seconds ago Up 5 seconds 80/tcp test-nginx
可以用 -q 来查看正在运行的容器ID 加上-a 可以查看所有容器的ID,包括已经停止的容器
docker ps -q
docker ps -qa
docker stop `docker ps -q` # 依次停止所有正在运行的容器
容器的控制 start | stop | restart ,启动已经停止的容器,停止正在运行的容器,重启指定容器
# docker stop test-nginx
# docker start test-nginx
# docker restart test-nginx
上面命令运行的容器无法访问,因为没有对外映射端口.如果容器需要对外提供访问,还需要映射端口, 先删除刚才创建的容器,rm 删除容器 -f 强制删除,可以指定容器名称或CONTAINER ID来进行删除
# docker rm -f test-nginx
test-nginx
创建一个新容器,并对外映射81端口提供访问, -p(小写) 指定本地要映射的端口,81:80 :前面是本地端口, :后面是容器内的端口.以下示例为将容器内的80端口映射到本地81端口以提供对外访问. -P(大写表示不指定端口,由docker随机选择一个本机端口进行映射)
# docker run -d -p 81:80 --name test-nginx nginx
664afe829c12b223b537723ece86f001d93f0bc46b85e2f2af345be5799f274e
# 查看容器创建情况
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
664afe829c12 nginx "nginx -g 'daemon of…" 6 seconds ago Up 5 seconds 0.0.0.0:81->80/tcp test-nginx
# 查看本地端口监听情况
]# ss -apnt | grep 81
LISTEN 0 128 :::81 :::* users:(("docker-proxy",pid=15009,fd=4))
通过浏览器访问,查看服务是否可以对外访问
查看容器日志, 参数logs 显示所有日志, -f 持续显示日志内容, --tail=10 显示最后10行日志
# docker logs test-nginx
172.23.2.124 - - [13/Jun/2019:02:45:21 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" "-"
# docker logs -f test-nginx
# docker logs -f --tail=10 test-nginx
挂载本地内容到容器内部。例如:将本地的index.html页面替换nginx默认页面。
-v 使用方法类似-p ,本地目录跟容器目录路径用:分隔,左边为本地路径,右边为容器路径。多个路径可以加多个 -v 。也可以挂载文件,将目录路径替换为文件路径即可。另外,挂载进容器的本地目录或文件会直接覆盖容器内的目录或文件。
# mkdir -p /test/nginx/html/
# echo "web site: TEST-NGINX~~~" > /test/nginx/html/index.html
# docker rm -f test-nginx
test-nginx
# docker run -d -p 81:80 -v /test/nginx/html:/usr/share/nginx/html --name test-nginx nginx
30bf3743d06ca7acde5a37ce3784d0efbd1e45c1002fa273cdb62ac0a929f6e8
访问页面进行测试
docker的网络模式
bridge模式:默认模式,容器桥接到docker0进行网络通讯
node模式:不进行任何网络配置,无网卡、IP、路由等
host模式:所有网络配置直接使用宿主机上的网络配置,例如,本机IP为1.1.1.1,如果创建一个nginx容器时指定网络模式为host,那该 容器的IP就是本机IP1.1.1.1 且不需要使用-p进行端口映射,端口自动对外暴露服务启动时的所有端口,可以通过ip+port直接访问。
container模式:直接使用指定容器的网络配置,一旦通过该模式连接,两个容器之间的服务可通过localhost地址访问。
以下是配置示例:
docker run --network=bridge
docker run --network=none
docker run --network=host
docker run --network=container:NAME_or_ID
docker network create dev-net
docker network rm dev-net
docker run --net dev-net
导出、导入镜像:有时部分服务器没有网络或者某些镜像未上传到镜像仓库,想在指定服务器上使用某个镜像,可以通过导出、导入的方式来复制镜像,如下示例:先用docker save命令将nginx镜像导出为tar包,然后复制到另外一台服务器上,用docker load 将tar包导入到新服务器上。因为导入镜像时一般不会导入名称和标签信息,最后用docker tag 给新导入的镜像打上标签。
docker save 719cd2e3ed04 > nginx.tar
docker load < nginx.tar
docker tag 719cd2e3ed04 nginx:latest
将指定容器制作成镜像,有时直接修改了镜像内容,想直接将该容器生成一个新镜像以做长期使用时,可以用commit命令将指定容器制作成新镜像。
docker commit -m "changed log" CONTAINER_ID IMAGE_NAME
进入某个容器进行操作,一般需要在制作镜像时安装bash命令行,基于该镜像创建的容器就可以通过exec -i -t 命令进入容器进行操作 exec 在运行的容器中运行命令 -i 保持连接 -t 打开一个tty终端
docker exec -it test-nginx /bin/bash
root@bf179274afba:/# # 进入容器后会看到主机名称变成了容器ID
从本地复制文件到容器中: docker cp 容器名称:容器内部具体路径 复制到本地的路径
从容器中复制文件到本地: docker cp 本地文件或目录路径 容器名称:容器内部具体路径
示例如下:
docker cp nginx:/etc/nginx/nginx.conf ./
docker cp nginx.conf nginx:/etc/nginx/
Docker容器的重启策略如下:
no,默认策略,在容器退出时不重启容器
on-failure,在容器非正常退出时(退出状态非0),才会重启容器
on-failure:3,在容器非正常退出时重启容器,最多重启3次
always,在容器退出时总是重启容器
unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
Docker容器的退出状态码
docker run的退出状态码如下: 0,表示正常退出 非0,表示异常退出(退出状态码采用chroot标准) 125,Docker守护进程本身的错误 126,容器启动后,要执行的默认命令无法调用 127,容器启动后,要执行的默认命令不存在 其他命令状态码,容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码
docker run的--restart选项
通过--restart选项,可以设置容器的重启策略,以决定在容器退出时Docker守护进程是否重启刚刚退出的容器。 --restart选项通常只用于detached模式的容器。 --restart选项不能与--rm选项同时使用。显然,--restart选项适用于detached模式的容器,而--rm选项适用于foreground模式的容器。
在docker ps查看容器时,对于使用了--restart选项的容器,其可能的状态只有Up或Restarting两种状态。
示例:
docker run -d --restart=always test-nginx
docker run -d --restart=on-failure:10 test-nginx
查看容器重启次数
docker inspect -f "{{ .RestartCount }}" test-nginx
查看容器最后一次的启动时间
docker inspect -f "{{ .State.StartedAt }}" test-nginx
volume卷:可以用来挂载到容器中持久化数据保存,当容器删除时,volume中的数据仍会保留,除非主动删除volume
docker volume create nginx_data # 创建一个名为nginx_data的volume卷
docker volume ls # 查看现有的volume卷
ls /var/lib/docker/volume/ # volume卷在本机上的默认路径
docker run -d -v nginx_data:/data nginx # 将nginx_data volume挂载到容器中,
挂载本地目录和挂载volume的区别
挂载时如果指定了绝对路径,例如 /data:/container_data 则是挂载本机的目录到容器内,如果是相对路径形式,就会是以volume的形式挂载到容器内;例如: data:/container_data
如果目录或者volume卷存在则直接挂载,如果不存在,则会自动创建,本机和容器内均会自动创建。
另外如果挂载到容器内的位置有文件,本地目录挂载到容器内时,不管本地目录是否为空,都会覆盖容器内目录。volume挂载到容器时,如果volume有数据,容器内没数据,则volume覆盖容器内目录;如果volume有数据,容器内也有数据,还是volume覆盖容器内数据;如果volume为空,容器内有数据,则容器内的数据会复制到volume中,这一点挂载volume是有别于挂载本机目录的。
############################################################# 常用 #########################################################
docker ps #查看运行的镜像
docker atach "CONTAINER ID" #进入已经运行的容器名称
#导出镜像(复制镜像到本地) # docker save > gitlab-runner.tar gitlab/gitlab-runner
# gitlab/gitlab-runner 为源镜像名
#删除这个镜像标签 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE vsftp latest 770a12f01b8b 13 days ago 252MB vsftpd v1.1 770a12f01b8b 13 days ago 252MB [root@localhost ~]# docker rmi vsftp:latest Untagged: vsftp:latest
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a4b2ee1de7f6 gitlab/gitlab-runner:v11.11.3 "/usr/bin/dumb-init …" 6 weeks ago Up 3 weeks gitlab-runner
ed7107f46646 gitlab/gitlab-ce:11.11.4-ce.0 "/assets/wrapper" 2 months ago Up 3 weeks (healthy) 0.0.0.0:80->80/tcp, 0.0.0.0:9090->9090/tcp, 0.0.0.0:2222->22/tcp, 0.0.0.0:8443->443/tcp gitlab
#停掉正在运行的镜像,再删除镜像
[root@localhost ~]# docker stop a4b2ee1de7f6 a4b2ee1de7f6
[root@localhost ~]# docker rmi -f image 5ead7b6a6d2d
Untagged: gitlab/gitlab-runner:v11.11.3
Untagged: gitlab/gitlab-runner@sha256:d193aa1fe2620ab2229b46aea56efffc88c5bcb9401f268e30093e3e89c5fdff
Deleted: sha256:5ead7b6a6d2d8b87274b77d2594a6b3e899387fde6bd8993ae21f9c8f79d0be4
#删除所有没有正在运行的容器 [root@localhost ~]# sudo docker rm $(sudo docker ps -a -q) a4b2ee1de7f6
#docker load < gitlab-runner.tar #导入本地镜像到docker
通过镜像运行一个容器,run 表示运行, -d 在后台运行, --name 给运行的容器取一个名称, 最后面为镜像名称+版本,不指定版本则默认使用latest [root@localhost ~]# docker run -d --name gitlab-runner gitlab/gitlab-runner:v11.11.3 1487ec12891e242927b69136cce0767910d439816efd48ffbb37d5230e7609f5 [root@localhost ~]#
#进入已经在运行的容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1487ec12891e gitlab/gitlab-runner:v11.11.3 "/usr/bin/dumb-init …" About an hour ago Up 15 minutes gitlab-runner
ed7107f46646 gitlab/gitlab-ce:11.11.4-ce.0 "/assets/wrapper" 2 months ago Up 3 weeks (healthy) 0.0.0.0:80->80/tcp, 0.0.0.0:9090->9090/tcp, 0.0.0.0:2222->22/tcp, 0.0.0.0:8443->443/tcp gitlab
[root@localhost ~]# docker exec -it 1487ec12891e /bin/bash #进入已经在运行的容器
root@1487ec12891e:/# ll
#docker: Error response from daemon: Conflict. The container name "/gitlab-runner" is already in use by container "1487ec12891e242927b69136cce0767910d439816efd48ffbb37d5230e7609f5". You have to remove (or rename) that container to be able to reuse that name. #经过上面一行运行容器报错情况时,因为之前运行docker容器还没有退出,导致出现容器重名情况, 所以先删除其他的容器再来启动