Docker服务状态
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"]
ENTRYPOINT
与CMD
结合
也可以指定–entrypoint参数来指定覆盖ENTRYPOINT ["java"] CMD ["-jar", "/e.jar", "--server.port=2001"]
如: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 -q
或docker -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.xml
把tmp
容器里面指定路径下的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": {}
}
]