文章目录
Docker Container
容器是镜像运行的实体,镜像是静态的只读文件,容器带有运行时需要的可写文件层,容器中的进程属于运行状态。具有初建、运行、停止、暂停、删除五种状态
容器的本质是主机上的运行的一个进程,但容器具有自己独立的命名空间和资源限制。容器是基于镜像创建的可运行实例,并且单独存在。
容器的生命周期
容器的生命周期是容器可能处于的状态
1、初建状态(created) 2、运行状态(running) 3、停止状态(stopped)
4、暂停状态(paused) 5、删除状态(deleted)
Docker Container Command
命令 | 别名 | 功能 | 备注 |
---|---|---|---|
docker create | docker container create | 创建容器 | |
docker run | docker container run | 运行容器 | 重要 |
docker attach | docker container attach | 链接到正在运行的容器 | |
docker commit | docker container | 将镜像提交为容器 | 重要 |
docker cp | docker container cp | 在容器和宿主机之间拷贝 | 重要 |
docker diff | docker container diff | 检查容器李文件结构的更改 | |
docker exec | docker container exec | 在运行的容器中执行命令 | 重要 |
docker export | docker container export | 将容器到处为tar | |
docker container inspect | 查看容器详细信息 | 重要 | |
docker kill | docker container kill | 杀死容器 | 重要 |
docker logs | docker container logs | 查看日志 | 重要 |
docker ps | docker container ls/list/ps | 查看正在运行的进程 | 重要 |
docker pause | docker container pause | 暂停进程 | |
docker port | docker container port | 查看容器端口映射 | |
docker container prune | 删除停止容器 | ||
docker rename | docker container rename | 容器重命名 | |
docker restart | docker container restart | 重启容器 | 重要 |
docker rm | docker container rm/remove | 删除容器 | 重要 |
docker start | docker container start | 启动容器 | 重要 |
docker stats | docker container stats | 查看容器资源占用信息 | 重要 |
docker stop | docker container stop | 停止容器 | 重要 |
docker top | docker container top | 查看某个容器的资源占用 | 重要 |
docker unpause | docker container unpause | 继续运行容器 | |
docker update | docker container update | 更新容器配置 | |
docker wait | docker container wait | 组织一个或多个容器等待 |
docker create 创建一个新的容器但不启动
# 参数和docker run 非常相似,除了少了-d选项
docker create [options] image [command][arg...]
-i # 以交互模式运行容器,通常与 -t同时使用
-t # 为容器分配一个伪终端
-P # 随机端口映射,容器内部端口随机映射到主机端口
-p # 指定端口映射, 格式: 宿主端口:容器端口
--name="nginx-clx" # 指定容器名称
-h # 指定主机名称
-e # 指定环境变量
--cpuset-cpu="0-1" # 指定程序在哪个cpu上跑
-m # 指定该容器执行可以使用最大内存量
--link=[] # 添加连接到另外一个容器
--rm # shell退出时自动删除容器
# 创建容器,并且指定容器80端口映射宿主机80端口
[root@VM-20-6-centos ~]# docker create --name mywebsite1 -p 80:80 nginx:1.21.4
## 容器创建成功
5ef282c6af17960e5b3bf1be1b90a21cb8fc25cc01705f910964043ef79e523e
### 可以看到宿主机80端口被使用
[root@VM-20-6-centos ~]# netstat -nltp | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 21935/nginx: master
#### 仅仅创建容器并不会去占用端口
[root@VM-20-6-centos ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ef282c6af17 nginx:1.21.4 "/docker-entrypoint.…" 3 minutes ago Created mywebsite1
##### 当我们运行容器时,就会报错
[root@VM-20-6-centos ~]# docker start mywebsite1
Error response from daemon: driver failed programming external connectivity on endpoint mywebsite1 (a7928d24dc31c9825cbaf183aa4bd5e2952ca722cdda1b3a6227e5c06b434763): Error starting userland proxy: listen tcp4 0.0.0.0:80: bind: address already in use
Error: failed to start containers: mywebsite1
docker run
在上文Docker Registry/Dontainer Comment模块已经详细描述过了,这里不再赘述
docker logs 查看容器日志
docker logs [options] container
-f --follow # 跟踪日志输出,终端上实时输出
--since # 显示某个开始时间的所有日志
-t --timestamps # 显示时间戳
-n --tail # 仅列出最新的N跳容器日志
docker attach 链接到正在运行中的容器
docker attach [options] container
--sig-proxy #是否将所有信号代理,默认true,如果设置为false ,退出的话不会影响容器,否则退出会导致容器退出
# 当前有两个容器正在运行
[root@VM-20-6-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ee8f6e4cea2b nginx:1.21.4 "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:8889->80/tcp, :::8889->80/tcp mywebsite3
c262f9fa4d8d nginx:1.21.4 "/docker-entrypoint.…" 21 minutes ago Up 20 minutes 0.0.0.0:8888->80/tcp, :::8888->80/tcp mywebsite2
# 链接mywebsite2,之后mywebsite2收到的信息都会被打印出来
[root@VM-20-6-centos ~]# docker attach mywebsite2
120.199.62.146 - - [30/May/2023:03:19:22 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" "-"
120.199.62.146 - - [30/May/2023:03:19:22 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" "-"
# 输入Ctrl + C 发送SIGINT信号,进程退出
^C2023/05/30 03:19:38 [notice] 1#1: signal 2 (SIGINT) received, exiting
2023/05/30 03:19:38 [notice] 32#32: exiting
2023/05/30 03:19:38 [notice] 32#32: exit
2023/05/30 03:19:38 [notice] 31#31: exiting
2023/05/30 03:19:38 [notice] 31#31: exit
2023/05/30 03:19:38 [notice] 1#1: signal 17 (SIGCHLD) received from 32
2023/05/30 03:19:38 [notice] 1#1: worker process 32 exited with code 0
2023/05/30 03:19:38 [notice] 1#1: signal 29 (SIGIO) received
2023/05/30 03:19:38 [notice] 1#1: signal 17 (SIGCHLD) received from 31
2023/05/30 03:19:38 [notice] 1#1: worker process 31 exited with code 0
2023/05/30 03:19:38 [notice] 1#1: exit
# 可以看到容器推出了,加上sig-proxy就不会出现这样的现象
[root@VM-20-6-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ee8f6e4cea2b nginx:1.21.4 "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:8889->80/tcp, :::8889->80/tcp mywebsite3
# 使用docker --sig-proxy=false
[root@VM-20-6-centos ~]# docker attach --sig-proxy=false mywebsite2
120.199.62.146 - - [30/May/2023:03:34:04 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" "-"
120.199.62.146 - - [30/May/2023:03:34:05 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" "-"
^C
# 容器并没有被终止
[root@VM-20-6-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ee8f6e4cea2b nginx:1.21.4 "/docker-entrypoint.…" 15 minutes ago Up 15 minutes 0.0.0.0:8889->80/tcp, :::8889->80/tcp mywebsite3
c262f9fa4d8d nginx:1.21.4 "/docker-entrypoint.…" 36 minutes ago Up 11 minutes 0.0.0.0:8888->80/tcp, :::8888->80/tcp mywebsite2
docker exec 在容器中执行命令
docker exec [options] container command [arg...]
-d # 分离模式 后台运行
-i # 即使没有附加也会保持STDIN打开,进行交互
-t # 分配一个伪终端
-e # 设置环境变量
-u # --user 指定用户"<name|uid>[:<group|gid>]"
-w ,--workdir # 指定工作目录
# 新建终端并执行bash指令
[root@VM-20-6-centos ~]# docker exec -it mywebsite2 bash
root@c262f9fa4d8d:/# curl 127.0.0.1
# -e 选项
[root@VM-20-6-centos ~]# docker exec -it -e mynginx=maxxin mywebsite2 bash
root@c262f9fa4d8d:/# env | grep mynginx
mynginx=maxxin
# -u 选项指定用户
# 查看nginx镜像用户信息
[root@VM-20-6-centos ~]# docker exec -it mywebsite2 cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
nginx:x:101:101:nginx user,,,:/nonexistent:/bin/false # 接下来使用这个用户
# 指定用户执行查看版本命令
[root@VM-20-6-centos ~]# docker exec -it -u nginx mywebsite2 nginx -v
nginx version: nginx/1.21.4
# -w 选项指定工作目录
[root@VM-20-6-centos ~]# docker exec -it -w /etc mywebsite2 bash
root@c262f9fa4d8d:/etc# pwd
/etc
docker start/stop 将容器启动/终止
docker start [options] container [container...]
docker stop [options] container [container...]
docker kill 强制退出容器
docker kill [options] container [container...]
-s # 发送的信号
# 注意 Docker Stop 发送的是SIGTERM信号,Docker Kill 发送的是SIGKILL信号
docker top 查看容器中运行的进程信息
docker top container [ps OPTIONS] # 查看容器中运行的进程信息,支持ps命令参数
# 因为部分容器内部并不支持 ps 指令,此时我们可以使用docker top进行替代
[root@VM-20-6-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ee8f6e4cea2b nginx:1.21.4 "/docker-entrypoint.…" 4 hours ago Up 4 hours 0.0.0.0:8889->80/tcp, :::8889->80/tcp mywebsite3
c262f9fa4d8d nginx:1.21.4 "/docker-entrypoint.…" 4 hours ago Up 4 hours 0.0.0.0:8888->80/tcp, :::8888->80/tcp mywebsite2
[root@VM-20-6-centos ~]# docker top ee8f6e4cea2b
UID PID PPID C STIME TTY TIME CMD
root 6785 6765 0 11:18 ? 00:00:00 nginx: master process nginx -g daemon off;
101 6829 6785 0 11:18 ? 00:00:00 nginx: worker process
101 6830 6785 0 11:18 ? 00:00:00 nginx: worker process
docker stats 显示容器资源的使用情况,包括:CPU、内存、网络 I/O 等
docker stats [options][container...]
--all, -a # 显示所有容器,包括不运行的
--format # 指定返回值的模板文件 如table json
--no-stream # 展示当前状态就直接退出了,不再实时更新。
--no-trunc # 不截断输出。
[root@VM-20-6-centos ~]# docker stats --no-stream
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
ee8f6e4cea2b mywebsite3 0.00% 1.957MiB / 3.608GiB 0.05% 1.48kB / 142B 0B / 4.1kB 3
c262f9fa4d8d mywebsite2 0.00% 1.996MiB / 3.608GiB 0.05% 6.75kB / 7.03kB 0B / 0B 3
CONTAINER ID # 容器 ID
NAME # 容器 名称。
CPU % 与 MEM % # 容器使用的 CPU 和内存的百分比。
MEM USAGE / LIMIT # 容器正在使用的总内存,以及允许使用的内存总量。
NET I/O # 容器通过其网络接口发送和接收的数据量。
BLOCK I/O # 容器从主机上的块设备读取和写入的数据量。
PIDs # 容器创建的进程或线程数
docker container inspect 查看容器详细信息
docker container inspect [options] container [container...]
-f # 指定返回值的模板文件 如table、json
-s # 显示总的文件大小
# docker inspect 会自动检查是镜像还是容器,然后显示响应信息
[root@VM-20-6-centos ~]# docker container inspect mywebsite2
docker port 用于列出指定容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口
docker port container [private_port[/proto]]
# 查看mywebsite2容器端口映射情况
[root@VM-20-6-centos ~]# docker port mywebsite2
80/tcp -> 0.0.0.0:8888
80/tcp -> [::]:8888
# 查看mywebsite2容器80
[root@VM-20-6-centos ~]# docker port mywebsite2 80/tcp
0.0.0.0:8888
[::]:8888
docker cp 在容器和宿主机之间拷贝文件
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
# 查看mywebsite2文件系统
[root@VM-20-6-centos ~]# docker exec -it mywebsite2 bash
root@c262f9fa4d8d:/# cd /usr/share/nginx/html/
# 发现在/usr/share/nginx/html/目录下存储 index.html, 我们想要将其拷贝到本地
root@c262f9fa4d8d:/usr/share/nginx/html# ls
50x.html index.html
root@c262f9fa4d8d:/usr/share/nginx/html# exit
exit
# 使用docker cp 进行拷贝
[root@VM-20-6-centos ~]# docker cp mywebsite2:/usr/share/nginx/html/index.html .
Successfully copied 2.56kB to /root/.
[root@VM-20-6-centos ~]# ll
-rw-r--r-- 1 root root 615 Nov 2 2021 index.html
docker diff 检查容器李文件结构的更改
docker diff container
# A代表add C代表change,说明容器启动修改或新增了这些文件
[root@VM-20-6-centos ~]# docker diff mywebsite2
C /etc
C /etc/nginx
C /etc/nginx/conf.d
C /etc/nginx/conf.d/default.conf
C /run
A /run/nginx.pid
C /root
A /root/.bash_history
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
# 手动新增一个文件
[root@VM-20-6-centos ~]# docker exec -it mywebsite2 bash
root@c262f9fa4d8d:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@c262f9fa4d8d:/# echo "hello" > /test.html
root@c262f9fa4d8d:/# exit
exit
[root@VM-20-6-centos ~]# docker diff mywebsite2
C /etc
C /etc/nginx
C /etc/nginx/conf.d
C /etc/nginx/conf.d/default.conf
C /root
A /root/.bash_history
A /test.html # 这个就是我们新增的文件
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
C /run
A /run/nginx.pid
docker commit 从容器中创建一个新的镜像
docker commit [options] container [repository[:TAG]]
-a # 提交的镜像作者
-c # 使用Dockerfile 指令来创建镜像;可以修改启动指令
-m # 提交时的说明文字
-p # 在commit时,将容器暂停
[root@VM-20-6-centos ~]# docker images nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.21.4 f6987c8d6ed5 17 months ago 141MB
nginx 1.21.1 822b7ec2aaf2 21 months ago 133MB
# 创建一个运行的容器
[root@VM-20-6-centos ~]# docker run -d --name mywebsite2forcommit nginx:1.21.4
f5216b4b133ad2bb4851a554274e984ae339e4c1c5b09dc038dfe1a7a39c15e1
[root@VM-20-6-centos ~]# docker ps | grep mywebsite2forcommit
f5216b4b133a nginx:1.21.4 "/docker-entrypoint.…" 16 seconds ago Up 15 seconds 80/tcp mywebsite2forcommit
[root@VM-20-6-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f5216b4b133a nginx:1.21.4 "/docker-entrypoint.…" 50 seconds ago Up 49 seconds 80/tcp mywebsite2forcommit
ee8f6e4cea2b nginx:1.21.4 "/docker-entrypoint.…" 5 hours ago Up 5 hours 0.0.0.0:8889->80/tcp, :::8889->80/tcp mywebsite3
c262f9fa4d8d nginx:1.21.4 "/docker-entrypoint.…" 5 hours ago Up 5 hours 0.0.0.0:8888->80/tcp, :::8888->80/tcp mywebsite2
# 使用运行中的容器制作一个镜像 mywebsite2:v1.0
[root@VM-20-6-centos ~]# docker commit mywebsite2forcommit mywebsite2:v1.0
sha256:d52a851164d0eeb8bf944526676bcaace63b5236c79962a7a7749b6735f47192
# 镜像制作完成
[root@VM-20-6-centos ~]# docker images mywebsite2
REPOSITORY TAG IMAGE ID CREATED SIZE
mywebsite2 v1.0 d52a851164d0 9 seconds ago 141MB
# -a -m -p
[root@VM-20-6-centos ~]# docker commit -a 'clx' -m 'create by clx' -p mywebsite2forcommit mywebsite2:v2.0
sha256:8c09df24ff7e3405154e92f0d8b2c109cb379e489bc3d40444817649287193ef
[root@VM-20-6-centos ~]# docker images mywebsite2
REPOSITORY TAG IMAGE ID CREATED SIZE
mywebsite2 v2.0 8c09df24ff7e 16 seconds ago 141MB
mywebsite2 v1.0 d52a851164d0 5 minutes ago 141MB
[root@VM-20-6-centos ~]# docker inspect mywebsite2:v2.0 | grep clx
"Comment": "create by clx",
"Author": "clx",
# -c 选项修改启动指令
[root@VM-20-6-centos ~]# docker commit -a 'clx' -m 'create by clx for commit test' -c 'CMD ["tail", "-f", "/etc/hosts"]' -p mywebsite2forcommit mywebsite2:v3.0
sha256:372d230e3edb5123675bc52d85d6c54ee6bc724fd4a33d43540a01451ee05e01
[root@VM-20-6-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f5216b4b133a nginx:1.21.4 "/docker-entrypoint.…" 18 hours ago Up 18 hours 80/tcp mywebsite2forcommit
ee8f6e4cea2b nginx:1.21.4 "/docker-entrypoint.…" 23 hours ago Up 23 hours 0.0.0.0:8889->80/tcp, :::8889->80/tcp mywebsite3
c262f9fa4d8d nginx:1.21.4 "/docker-entrypoint.…" 23 hours ago Up 23 hours 0.0.0.0:8888->80/tcp, :::8888->80/tcp mywebsite2
[root@VM-20-6-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mywebsite2 v3.0 372d230e3edb 12 seconds ago 141MB
# 运行新生成镜像
[root@VM-20-6-centos ~]# docker run -d --name mywebsite2forcommit2 mywebsite2:v3.0
60f2be510c1bde7b9f9633855917b21385e33c0a895dbf116afed6d768912e61
# 发现后者启动命令确实被修改了
[root@VM-20-6-centos ~]# docker ps --no-trunc | grep mywebsite2forcommit
60f2be510c1bde7b9f9633855917b21385e33c0a895dbf116afed6d768912e61 mywebsite2:v3.0 "/docker-entrypoint.sh tail -f /etc/hosts" 16 seconds ago Up 15 seconds 80/tcp mywebsite2forcommit2
f5216b4b133ad2bb4851a554274e984ae339e4c1c5b09dc038dfe1a7a39c15e1 nginx:1.21.4 "/docker-entrypoint.sh nginx -g 'daemon off;'" 18 hours ago Up 18 hours 80/tcp mywebsite2forcommit
docker pause/unpause 暂停/取消暂停容器中所有的进程,剥夺/赋予该进程时间片
docker pause container [container...]
# 暂停容器
[root@VM-20-6-centos ~]# docker pause mywebsite2
mywebsite2
[root@VM-20-6-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c262f9fa4d8d nginx:1.21.4 "/docker-entrypoint.…" 24 hours ago Up 23 hours (Paused) 0.0.0.0:8888->80/tcp, :::8888->80/tcp mywebsite2 # 该容器被暂停
# 取消暂停该容器
[root@VM-20-6-centos ~]# docker unpause mywebsite2
mywebsite2
[root@VM-20-6-centos ~]# docker ps
c262f9fa4d8d nginx:1.21.4 "/docker-entrypoint.…" 24 hours ago Up 23 hours 0.0.0.0:8888->80/tcp, :::8888->80/tcp mywebsite2
docker rm 删除容器
docker rm [options] container [container...]
-f # 公国SIGKILL信号强制删除一个运行中的容器(非常危险,慎用)
# 删除正在运行的容器会报错
[root@VM-20-6-centos ~]# docker rm mywebsite2forcommit2
Error response from daemon: You cannot remove a running container 60f2be510c1bde7b9f9633855917b21385e33c0a895dbf116afed6d768912e61. Stop the container before attempting removal or force remove
# 现将容器停止后才可以进行删除
[root@VM-20-6-centos ~]# docker stop mywebsite2forcommit2
mywebsite2forcommit2
[root@VM-20-6-centos ~]# docker rm mywebsite2forcommit2
mywebsite2forcommit2
docker export 导出容器为tar文件
docker export [options] container
# -o # 写入到文件
# 注意: 由docker export制作的tar文件导出的镜像的config会被清空,需要我们手动配置
[root@VM-20-6-centos ~]# mkdir -p /data/maxxin/testexport
[root@VM-20-6-centos ~]# cd /data/maxxin/testexport
[root@VM-20-6-centos testexport]# ll
total 0
# 进行导出容器
[root@VM-20-6-centos testexport]# docker export -o mywebsite4.tar mywebsite4
ls[root@VM-20-6-centos testexport]# ls -l
total 140640
-rw------- 1 root root 144015360 May 31 10:51 mywebsite4.tar
docker import 从归档文件中创建镜像
docker import [options] file | URL | - [repository[:TAG]]
-c # 设置config参数
-m # 设置注释
[root@VM-20-6-centos testexport]# docker import mywebsite4.tar mywebsite4:v1.0
sha256:b517c6812cdeb137d81b3052ed41283e08ff4a49b4b5197737a0378a04cc784c
# 设置启动指令
[root@VM-20-6-centos testexport]# docker import -c 'CMD ["nginx", "-g", "daemon off;"]' mywebsite4.tar mywebsite4:v2.0
sha256:04a952bbf5b5ff4ff6e278da95482eadca06aff1ebd6ddaf59e677899f95a5e9
docker wait 阻塞运行置容器停止,然后打印它的退出码
docker wait container
# 创建一个容器
[root@VM-20-6-centos testexport]# docker run --name mywebsite5 -d nginx:1.21.4
8d8f79a42c3a9488a4e3ce58e7d3ddd0d4e4eb997d16616a08109e7e52cea799
# 终止容器
[root@VM-20-6-centos testexport]# docker kill mywebsite5
mywebsite5
## 新建终端,进行等待
[root@VM-20-6-centos testexport]# docker wait mywebsite5
137
docker rename 重命名容器
docker rename container new_name
[root@VM-20-6-centos testexport]# docker rename mywebsite6 mywebsite7
docker container prune 删除所有停止的容器
docker container prune [options]
-f --force # 不提示是否进行确认
docekr update 更新容器配置
docker update [options] container [container...]
--cpus # cpu数量
--cpuset-cpus # 使用哪些cpu
--memory # 内存限制
--memory-swap # 交换内存的限制
--cpu-period # 用来指定容器对CPU的使用要在多长时间内做一次重新分配
--cpu-quota # 是用来指定在这个周期内,最多可以由多少时间来跑这个容器
# 更新容器配置
[root@VM-20-6-centos testexport]# docker update --memory 500Mib mywebsite8
容器批量处理技巧
命令 | 解释 |
---|---|
docker container ls -qf name=xxx | 根据名称过滤得到容器编号 |
docker container ls --filter status=running | 根据状态过滤容器信息 |
docker container ls -aq | 静默获取全部容器id |
docker container ls --filter ancestor=xxx | 过滤镜像名为xxx的容器信息 |
docker container ls --filter ancestor=xxx | 过滤镜像id为xxx的容器信息 |
-a # 表示置打印所有的容器信息,包括正在运行和已经退出的
-q # 表示置返回容器ID
-f # 表示基于给的条件过滤,等价于--filter 选项
容器批量操作技巧
# 使用 ` ` 将id喂给docker stop
[root@VM-20-6-centos ~]# docker stop `docker ps -q`
67bc13afce8c
2b710ba85db4
a9d251bfc68e
420f60ae5014
[root@VM-20-6-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
容器的交互模式
attached 模式(调试使用)
[root@VM-20-6-centos ~]# docker run --name mynginx006 -p 8889:80 nginx:1.24.0
# 类似这样创建的容器,就是attached模式,这样容器会在前台运行
# 访问服务器网址时,每访问一次就会打印一次日志,主要用于开发环境(便于调试)
# 不用于生产环境,日志进程被杀死会连带着服务被杀死
detached 模式(生产使用)
[root@VM-20-6-centos ~]# docker run -d --name mynginx007 -p 8889:80 nginx:1.24.0
# 在 attached模式基础上加上一个-d 或者 --detach选项表示detached 模式,即在后台执行
# 使用该指令可以将容器由 detached 模式转换到 attached 模式
[root@VM-20-6-centos ~]# docker attach mynginx007
interactive 模式 交互式容器
# 创建一个容器后,可能需要取容器内部获取一些信息或者执行一些命令,就需要进入到交互式模式
# 1、创建交互式容器
[root@VM-20-6-centos ~]# docker run -it --name mynginx008 -p 8890:80 nginx:1.24.0 bash
# shell退出容器也就推出了,所以不推荐在生产环境使用
# 2、和detached模式容器进行交互
[root@VM-20-6-centos ~]# docker exec -it mynginx010 bash # 在 mynginx010容器中执行交互式 bash指令
# 使用exec容器交互模式,使用exit推出后,不影响器正常运行
root@477394966da9:/# exit
exit
容器和宿主机数据交互
[root@VM-20-6-centos ~]# docker run -d --name mynginx011 -p 8888:80 nginx:1.24.0
340121d997a7cbaaef4ac5868a89290047534924f8f7bb5f199bc5933da35065
[root@VM-20-6-centos testcp]# docker cp mynginx011:/usr/share/nginx/html/index.html .
Successfully copied 2.56kB to /data/maxxin/testcp/.
# 可以看到容器中的文件被我们拷贝到宿主机上了
[root@VM-20-6-centos testcp]# ls
index.html
# 进行修改
[root@VM-20-6-centos testcp]# vim index.html
# 拷贝回去
[root@VM-20-6-centos testcp]# docker cp ./index.html mynginx011:/usr/share/nginx/html/
Successfully copied 2.56kB to mynginx011:/usr/share/nginx/html/
[root@VM-20-6-centos testcp]# docker exec -it mynginx011 bash
# 到该目录下查看文件是否被修改
root@340121d997a7:/# cd /usr/share/nginx/html
## 容器和容器之间进行文件拷贝,发现并不支持
[root@VM-20-6-centos testcp]# docker cp mynginx011:/usr/share/nginx/html/index.html mynginx010:/usr/share/nginx/html/
copying between containers is not supported
容器自动删除
# 1、attached状态容器退出自动删除
[root@VM-20-6-centos ~]# docker run --name mynginx012 --rm nginx:1.24.0
# 2、后台运行容器,(stop)停止后也会被自动删除
[root@VM-20-6-centos ~]# docker run -d --rm --name mynginx012 nginx:1.24.0
# 注意:生产环境慎重使用该选项,因为误停止服务可能会导致容器删除
容器自动重启
docker run --restart=no [容器名] # 默认值不自动重启
docker run --restart=on-failure:3 [容器名] # on-failure 若容器的退出状态非0,则docker 自动重启容器,还可以指定重启次数,若超指定次数未能启动容器则放弃
docker run --restart=always[容器名] # always 容器退出时总是重启
docker run --restart=unless-stopped [容器名] # unless-stopped 容器退出时总是重启,但不考虑Docker守护进程启动时就已经停止的容器
# 如果容器启动时忘记设置--restart 参数,可以通过以下命令更新
docker update --restart=always[容器名]
# 如果使用docker stop终止容器则不会进行重启
容器环境变量设置
# 使用-e选项添加环境变量
[root@VM-20-6-centos ~]# docker run -it --name mynginx014 -e MYTEST1=1 -e MYTEST2=2 -e MYTEST3=3 nginx:1.24.0 bash
root@1c9bd5aa3ddc:/# env | grep MYTEST
MYTEST1=1
MYTEST3=3
MYTEST2=2
# 使用配置文件完成环境变量设置
[root@VM-20-6-centos ~]# mkdir /data/maxxin/mytestenv
[root@VM-20-6-centos ~]# cd /data/maxxin/mytestenv
[root@VM-20-6-centos mytestenv]# vim myenv
[root@VM-20-6-centos mytestenv]# docker run -it --rm --name mynginx015 --env-file=./myenv nginx:1.24.0 bash
root@e1ed65d01133:/# env | grep MYTEST
MYTEST1=1
MYTEST3=3
MYTEST2=2
容器信息查看
[root@VM-20-6-centos mytestenv]# docker run -d --name mynginx015 -p 8815:80 -e MYTEST=1 -h mynginx015.com nginx:1.24.0
c8fe774a80cccf3ede6f5a9c1219b751bdbda6b91cdf392585ef6531c6f9dfee
# 查看摘要信息
[root@VM-20-6-centos mytestenv]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8fe774a80cc nginx:1.24.0 "/docker-entrypoint.…" 7 seconds ago Up 6 seconds 0.0.0.0:8815->80/tcp, :::8815->80/tcp mynginx015
# 查看详情
[root@VM-20-6-centos mytestenv]# docker container inspect mynginx015
容器镜像导入和导出
[root@VM-20-6-centos mytestenv]# docker run -d --name mynginx016 -p 8816:80 nginx:1.24.0
6b58beb6a70cd1554cd535c460116b5c2294baaa02d9e06da822ff3d9003eebb
[root@VM-20-6-centos mytestenv]# docker exec -it mynginx016 bash
root@6b58beb6a70c:/# cd /usr/share/nginx/html
root@6b58beb6a70c:/usr/share/nginx/html# echo "I am from xiaobais-attack docker" > index.html
root@6b58beb6a70c:/usr/share/nginx/html# exit
exit
[root@VM-20-6-centos mytestenv]# mkdir -p /data/maxxin/testtar
[root@VM-20-6-centos mytestenv]# cd /data/maxxin/testtar
[root@VM-20-6-centos testtar]# ll
total 0
[root@VM-20-6-centos testtar]# docker export -o mynginx016.tar mynginx016
[root@VM-20-6-centos testtar]# ls
mynginx016.tar
# 两台机器的.tar文件传输即可以使用scp也可以使用xshell自带的文件传输
[root@VM-20-6-centos testtar]# docker import mynginx016.tar mynginx:v016
sha256:c0f09cd18c8ce8e31beb97712493a5cfbea5453933ce4f8d2ea3356ff932ce3a
[root@VM-20-6-centos testtar]# docker images mynginx
REPOSITORY TAG IMAGE ID CREATED SIZE
mynginx v016 c0f09cd18c8c 16 seconds ago 140MB
# 可以发现导入的容器没有找到启动命令,这是因为export 导出会清空一些配置
[root@VM-20-6-centos testtar]# docker run -d --name mynginx017 -p 8817:80 mynginx:v016
docker: Error response from daemon: No command specified.
# 手动添加启动指令就可以完成启动
[root@VM-20-6-centos testtar]# docker run -d --name mynginx017 -p 8817:80 mynginx:v016 nginx -g "daemon off;"
61de81924d6208ad359e73abf9e0aaf5b807fb21bf18c8dc6f92082a74277269
[root@VM-20-6-centos testtar]# docker exec -it mynginx017 bash
root@61de81924d62:/# cd /usr/share/nginx/html
root@61de81924d62:/usr/share/nginx/html# cat index.html
I am from xiaobais-attack docker
相比于docker save/load指令制作镜像,docker export/import 会清空一些配置,所以前者更为常用
容器日志查看
容器占用资源查看
# 方法1、
[root@VM-20-6-centos ~]# docker stats --no-stream mynginx018
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
48686bc5b757 mynginx018 0.00% 2.023MiB / 3.608GiB 0.05% 656B / 0B 0B / 8.19kB 3
# 方法2、使用docker top [container] + ps命令的参数
[root@VM-20-6-centos ~]# docker top mynginx018 aux
MySQL容器化安装
[root@VM-20-6-centos ~]# docker run --name mysql -e MYSQL_ROOT_PASSWORD=2519375966 -p 8888:3306 -d mysql:5.7
Redis容器化安装
[root@VM-20-6-centos ~]# docker run --name redis -d -p 8889:6379 redis:7
a6696e0c0f45cb2219d13db37df0fc69b5f656f19e022d8d2422cffa2e31b91e
[root@VM-20-6-centos ~]# docker exec -it redis bash
root@a6696e0c0f45:/data#
root@a6696e0c0f45:/data# redis-cli
127.0.0.1:6379> set sellcount 1
OK
127.0.0.1:6379> get sellcount
"1"
镜像源配置
# 中科大源网站 推荐使用这个
https://mirrors.ustc.edu.cn/help/centos.html
# 清华大学开源软件镜像站
https://mirrors.tuna.tsinghua.edu.cn/help/centos/
制作C++容器
# 1、下载Centos镜像
[root@VM-20-6-centos ~]# docker pull centos:7
# 2、启动容器 配置镜像源 刷新缓存 下载gcc
[root@VM-20-6-centos ~]# docker run -it --name mycpp centos:7 bash
[root@4050678bfc8c /]# sed -e 's|^mirrorlist=|#mirrorlist=|g' \
> -e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.ustc.edu.cn/centos|g' \
> -i.bak \
> /etc/yum.repos.d/CentOS-Base.repo
[root@4050678bfc8c /]# yum makecache
[root@4050678bfc8c /]# yum install gcc
# 3、编写cpp代码进行编译