dokcer命令一览

2023-11-20

Docker服务状态

安装参考:https://yutian.blog.csdn.net/article/details/119705377

1 为什么要使用Docker

  • Docker是开发运维一体化的核心工具,提高开发-测试-运维的生命周期的效率
  • 在服务器上可以大量运行Docker容器,充分利用服务器的运算资源

2 常用命令

2.1 系统级管理命令

systemctl start docker启动docker服务
systemctl restart docker重启动docker服务
systemctl status docker查看docker服务
这里显示active(running)说明正在运行,可以继续执行docker相关的命令

[root@centos7964 volumes]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since 四 2022-01-06 09:06:23 CST; 1h 46min ago
     Docs: https://docs.docker.com
 Main PID: 4173 (dockerd)
    Tasks: 32
   Memory: 179.2M
   CGroup: /system.slice/docker.service
           ├─4173 /usr/bin/dockerd
           └─4184 containerd --config /var/run/docker/containerd/containerd.toml --log-level warn

systemctl enable docker设置开机启动
systemctl disable docker禁用开机启动
docker info查看docker信息
docker info | grep 'Docker Root Dir:'查看docker info中具体key的信息
systemctl stop docker停止docker服务

由于国内网络问题,需要配置加速器来加速。修改配置文件 /etc/docker/daemon.json
下面命令直接生成文件 daemon.json

cat <<EOF > /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
  ],
  "max-concurrent-downloads": 10,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    },
  "data-root": "/var/lib/docker"
}
EOF

2.2 镜像

docker pull centos:7拉取一个镜像
docker images查看镜像列表

[root@centos7964 volumes]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    605c77e624dd   7 days ago     141MB
centos       7         eeb6ee3f44bd   3 months ago   204MB
redis        latest    bc8d70f9ef6c   9 months ago   105MB

:latest可以省略
docker tag redis:latest zidieq/redis:6 给镜像添加一个别名
docker rmi redis 把redis标签撕掉,如果撕掉该标签后,该镜像还有其他的名字,则只进行Untagged操作,否则还会进行磁盘文件的删除操作Deleted

docker history centos:7 查看镜像制作层次,每次制作会添加一些文件、环境变量等进镜像中

[root@centos7964 jdk]# docker history centos:7
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
eeb6ee3f44bd   3 months ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>      3 months ago   /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>      3 months ago   /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4…   204MB

docker save centos:7 | gzip > cos:7.tar.gz 导出镜像
docker image rm centos:7 删除镜像
docker load < cos:7.tar.gz 从文件中导入镜像

2.2.1 创建私有镜像服务器

docker pull registry下载官方registry镜像,根据要求启动容器后就是一个镜像服务器了

2.2.2 自制镜像

首选准备一个基础镜像,比这里使用上文pull下来的centos:7
新建一个目录如 /root/setup/jdk,并存上jdk-8u51-linux-x64.tar.gz文件
在此目录下创建Dockerfile文件

vim  Dockerfile

输入如下内容,实际使用时需要把#及之后的注释内容删掉,把#前面紧挨的一个空格也删掉

# 选择基础镜像
FROM centos:8

# jdk 和 tomcat 文件添加到镜像的 /usr/local/ 目录下
# ADD 指令会自动解压文件
ADD jdk-8u291-linux-x64.tar.gz apache-tomcat-10.0.6.tar.gz /usr/local/

# 切换到镜像中指定的文件夹下
WORKDIR /usr/local/apache-tomcat-10.0.6/

# 设置环境变量
ENV JAVA_HOME=/usr/local/jdk1.8.0_291 \
    CATALINA_HOME=/usr/local/apache-tomcat-10.0.6 \
    PATH=/usr/local/jdk1.8.0_291/bin:/usr/local/apache-tomcat-10.0.6/bin:$PATH

# EXPOSE 8080 只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务
# 这个声明有两个好处:
#   1.帮助镜像使用者理解这个镜像服务的端口,以方便配置映射
#   2.在运行时使用随机端口映射时,也就是 docker run -P时,会自动随机映射 EXPOSE 的端口
EXPOSE 8080

# 设置启动命令
CMD ["catalina.sh", "run"]

ADD jdk.tar.gz tomcat.tar.gz /usr/local/docker 将指定的文件解压到容器里指定的目录中,添加多个文件用空格隔开
ENV JAVA_HOME=/usr/local/docker/jdk添加环境变量,多个变量使用空格隔开,支持折行
WORKDIR /data 用来指定当前工作目录(或者称为当前目录),当使用相对目录的情况下,采用上一个WORKDIR指定的目录作为基准,相当与cd 命令,但不同的是指定了WORKDIR后,容器启动时执行的命令会在该目录下执行

如果是要添加sentinel的话,就这样写

FROM centos:7
ADD jdk-8u51-linux-x64.tar.gz  /usr/local/
ADD sentinel-dashboard-1.8.1.jar  /usr/local/
ENV JAVA_HOME=/usr/local/jdk1.8.0_51 \
    PATH=/usr/local/jdk1.8.0_51/bin:$PATH
#暴露端口号,仅影响docker run -P,所以此操作是可选的
EXPOSE 8080
#指定开机时执行的命令
ENTRYPOINT ["java","-jar","/usr/local/sentinel-dashboard-1.8.1.jar"]

执行如下的命令,即制作完成,

# 不要丢掉这里的点,-t表示镜像标识(镜像名),是tag单词的缩写.
[root@localhost tomcat]# docker build -t tomcat:10 .
# 下面是执行build语句的输出内容
Sending build context to Docker daemon  156.8MB
Step 1/6 : FROM centos:8
# 本层生成的镜像的编号,如果本地已存在此镜像,则可直接重用,无需再次下载
 ---> 300e315adb2f
Step 2/6 : ADD jdk-8u291-linux-x64.tar.gz apache-tomcat-10.0.6.tar.gz /usr/local/
# 本层生成的镜像的编号
 ---> 7c248c55b06e
Step 3/6 : WORKDIR /usr/local/apache-tomcat-10.0.6/
# 临时生成一个容器,并在此临时容器中执行上面的命令
 ---> Running in 2689e635b388
# 移除该临时容器
Removing intermediate container 2689e635b388
# 本层生成的镜像的编号
 ---> 4b2a2e0bb328
Step 4/6 : ENV JAVA_HOME=/usr/local/jdk1.8.0_291     CATALINA_HOME=/usr/local/apache-tomcat-10.0.6     PATH=/usr/local/jdk1.8.0_291/bin:/usr/local/apache-tomcat-10.0.6/bin:$PATH
 ---> Running in 86d4114a803f
Removing intermediate container 86d4114a803f
# 本层生成的镜像的编号
 ---> 7db8add9f182
Step 5/6 : EXPOSE 8080
 ---> Running in 46342f53fa5f
Removing intermediate container 46342f53fa5f
# 本层生成的镜像的编号
 ---> 5e82b26f79e9
Step 6/6 : CMD ["catalina.sh", "run"]
 ---> Running in dc035893da6f
Removing intermediate container dc035893da6f
# 本层生成的镜像的编号
 ---> 80240769c257
Successfully built 80240769c257

此通过docker images就可以在列表里面看到刚创建的镜像了
使用docker history tomcat:10来查看镜像层次信息,可以看到docker build过程中每层生成的镜像的编号

[root@localhost dockerBaseFiles]# docker history tomcat:10
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
80240769c257   2 minutes ago   /bin/sh -c #(nop)  CMD ["catalina.sh" "run"]    0B
5e82b26f79e9   2 minutes ago   /bin/sh -c #(nop)  EXPOSE 8080                  0B
7db8add9f182   2 minutes ago   /bin/sh -c #(nop)  ENV JAVA_HOME=/usr/local/…   0B
4b2a2e0bb328   2 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local/apache-…   0B
7c248c55b06e   2 minutes ago   /bin/sh -c #(nop) ADD multi:68c3fb846911bc6f…   375MB
300e315adb2f   14 months ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>      14 months ago   /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>      14 months ago   /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7…   209MB

注意:如果需要push到自己的docker空间上的话,需要使用zidieq/jdk:8这样的格式,即用户名/镜像名称:tag

2.3 容器

2.3.1 容器创建、启动与停止

docker run -it centos:7 bash创建并启动容器

[root@centos7964 volumes]# docker run -it centos:7 bash
# @后面的内容发生了改变,表示已经进入了容器里面
[root@cfd421b2af0a /]#
docker run -d -p 8180:8080 \ #8180对应宿主机里面的端口,8080对应容器里面的端口
--name sentinel \ #给容器起一个名字
--rm \ #表示在容器停止后自动删除
-v /root/servers:/usr/sca \ #挂载宿主机的/root/servers目录到容器的/usr/sca目录
jdk:8 java -jar /usr/sca/sentinel-dashboard-1.8.1.jar #使用jdk:8镜像,然后运行后面的命令

注:实际使用时请将#及后面的注释内容、及前面紧挨的一个空格都删掉
其中:
centos:7- 镜像名, 或 image id 的前几位,
-it 这是两个参数(-i表示交互式操作, -t 表示终端)
bash 表示进入操作终端,基于交互式进行相关操作(例如执行linux相关指令)。此处的命令还有如下指定方式

  • 直接写要执行的命令
    java -jar /e.jar --server.port=2001
  • 通过CMD
    CMD ["java", "-jar", "/e.jar", "--server.port=2001"]
  • ENTRYPOINTCMD结合
    ENTRYPOINT ["java"]
    CMD ["-jar", "/e.jar", "--server.port=2001"]
    
    也可以指定–entrypoint参数来指定覆盖
    如:docker run --entrypoint ls tomcat -a -l此条命令中的ls会覆盖掉镜像中的ENTRYPOINT-a -l会覆盖掉CMD里面的命令

-d 表示后台运行
-p 小写的p,用于实现端口映射(假设外部要访问这个容器,必须要做端口映射)
-P 大写的P,表示自动根据镜像文件中使用EXPOSE暴露的端口号自动绑定到宿主机的空闲端口上。此种使用情况比较有限,因为容器内部的端口可能会因为配置文件的改变而改变,但是自动映射时只会根据EXPOSE指定的端口进行映射
--name 表示为启动的容器起一个名字
--rm 表示容器停止后会自动删除掉,添加了此参数的容器,在使用inspect得到的信息里面AutoRemove参数的值为true
--net host 直接使用宿主机端口,即容器中的端口直接原样绑定到宿主机上,也可以指定network里面创建的网络名称

docker ps查看正在运行的容器
docker ps -a查看所有的容器,不论是否正在运行
docker ps -a -qdocker -aq只显示容器的id的列表,其他的信息都不显示
exit可以从容器里面退回到宿主机
docker container start cfd 启动指定容器,和docker run的不同之处在于后者是创建新的容器,则前者是启动已有的容器
docker container restart cfd 重启指定容器
docker container stop cfd 停止指定的容器
docker container rm cfd 删除指定的容器
docker container rm -f cfd 强制删除指定容器,不论是否正在运行
docker rm -f $(docker ps -aq) 删除所有容器,直接引用docker ps -aq命令的结果

2.3.3 进入容器

docker exec -it cfd bash进入正在运行的容器 cfd为容器id

# 进入容器,运行指定的命令
docker exec -it cfd pwd
docker exec -it cfd touch f1.txt
docker exec -it cfdls -l

# 启动 top 查看进程列表
# ctrl+c 可以退出top
docker exec -it cfdtop

# 启动bash命令行
# exit 可以退出bash
docker exec -it cfd bash

docker update mysql --restart=always 设置mysql这个容器在docker服务启动时也跟着启动
docker update mysql --restart=no 取消mysql这个容器在docker服务启动时也跟着启动的设置

2.3.4 容器运行日志

docker container logs 802 查看指定容器的日志,#802为自己的容器id(至少写前三位,如果有重复,则再加一位,直至可以唯一区分出该容器)

2.4 数据卷

数据卷实际存在于宿主机,可被挂载到容器中,实际容器间的数据共享,container-vol是自定义的名字
docker volume create conainer-vol 创建数据卷

[root@centos7964 ~]# docker volume create container-vol
container-vol

docker volume ls //查看列表
docker volume inspect container-vol //查看指定数据卷的信息,可看到存放位置

[root@centos7964 ~]# docker volume ls
DRIVER    VOLUME NAME
local     container-vol

[root@centos7964 _data]# docker volume inspect container-vol
[
    {
        "CreatedAt": "2022-01-06T09:34:00+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/container-vol/_data",
        "Name": "container-vol",
        "Options": {},
        "Scope": "local"
    }
]

2.4.1 数据的挂载

把数据卷挂载到对应镜象的容器中
docker run -it --mount source=container-vol,target=/root centos:7 bash

docker run -it -v container-vol:/root centos:7 bash
docker run -it -v /usr/app:/opt/app centos:7 bash直接挂载宿主的实际目录,如果目录不存在时会自动创建
docker volume rm container-vol 操作删除后,宿主机里面对应的实际的文件也会被删除
如果数据卷已经被任一容器挂载了,无论容器是否启动,都不允许删除该数据卷,否则删除时会报如下错误

[root@centos7964 volumes]# docker volume rm container-vol
Error response from daemon: remove container-vol: volume is in use - [f591c4a4652106510d4385bbd7d11af7

docker volume prune 清理未被使用的数据卷
docker inspect 91a #91a 为容器id的前三位 查看挂载信息

# ... 一大堆其他信息
"Mounts": [
            {
                "Type": "bind",
                "Source": "/usr/app",
                "Destination": "/usr/app",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
# ... 一大堆其他信息

2.4.2 从容器中复制出文件

docker cp tmp:/usr/local/tomcat/conf/server.xml ~/server.xmltmp容器里面指定路径下的server.xml文件复制到宿主机的~目录下

2.5 虚拟网络

为容器们提供一个子网,所有加入了同一子网的容器之间都可以互通
docker network create -d bridge t-net 创建一个虚拟网络 t-net为自己起的网络名称, -d bridge 参数是可选的,因为bridge是默认的
docker network ls 列出所有的网络

[root@centos7964 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
1a5cb1690c6e   bridge    bridge    local
21c7ce28533e   host      host      local
09bf961f05b2   none      null      local
94355d22d3d8   t-net     bridge    local

docker network inspect 943 查看指定虚拟网络的详细信息

[root@centos7964 ~]# docker network inspect 943
[
    {
        "Name": "t-net",
        "Id": "94355d22d3d8e78881ce6a31aec05e605b508595a6128d689e45a4663c8c8ca5",
        "Created": "2022-01-06T17:48:03.51137072+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

docker run -it --name app1 --network t-net centos:7 bash 打开终端,基于centos:7这个镜像启动容器app1,并加入到t-net这个网络
docker network connect t-net nacos已经创建好的容器要加入指定的网络
此时再查看网络信息的时候就可以看到所有已加入进来的两个容器了

[root@centos7964 ~]# docker network inspect 943
[
    {
        "Name": "t-net",
        "Id": "94355d22d3d8e78881ce6a31aec05e605b508595a6128d689e45a4663c8c8ca5",
        "Created": "2022-01-06T17:48:03.51137072+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "c49ba71c060b6f1123fca01f39387da477f050c130f747115e9a3b15e3631f00": {
                "Name": "app1",
                "EndpointID": "e20234f5e0d64f1f4b239d6b1245c0b0ca38ffc1747332b63c07d08a7ae06f85",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "cf69e9515fb884f961a8a1e378b0ba7470c6deb5e652bfb6828362152d2ee762": {
                "Name": "nacos",
                "EndpointID": "abfaa64056257e9dc19f3756b45a041eefc04f647b5d6517d6f7d195a1784e80",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

dokcer命令一览 的相关文章

随机推荐