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容器还没有退出,导致出现容器重名情况, 所以先删除其他的容器再来启动

原文地址:https://www.cnblogs.com/zhiqiao/p/11459158.html