赞
踩
需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。
目录
2、查看镜像详细信息docker image inspect
4、删除镜像docker rmi/删除容器docker rm
6、将docker save的tar包还原回来docker load
1、创建一个新容器并运行一个命令docker run/创建一个新容器但不运行docker create(命令和docker run一样,docker run多一个-d选项)
--cpuset-cpus="0-2" or --cpuset-cpus="0,1,2": 绑定容器到指定 CPU 运行
--link=[]: 添加链接到另一个容器,让两个容器能相互访问
4、将当前终端连接到正在运行的某个Docker容器的标准输入、输出和错误docker attach
6、将停止的容器重新启动docker start/将运行的容器停止docker stop
11、查看容器详细信息docker container inspect
15、从容器中创建一个新的自定义镜像docker commit
16、暂停/取消暂停容器中的所有进程docker pause/docker unpause
17、导出容器内容为tar包docker export/将导出的tar包还原为镜像docker import
18、阻塞运行直到容器停止,并打印退出码docker wait
20、删除所有停止的容器docker container prune
镜像仓库:存放镜像的仓库,每个镜像仓库包含多个tag标签
tag标签:每个标签对应一个镜像
docker指南:Docker Docs
docker官方仓库:https://hub.docker.com/
命令 | 别名 | 功能 |
docker login | 登录仓库 | |
docker pull | docker image pull | 拉取镜像 |
docker push | docker image push | 推送镜像 |
docker search | 查找镜像 | |
docker logout | 登出仓库 |
- sudo docker login
- sudo docker login -u jianglingyu
从镜像仓库拉取或更新指定镜像
- sudo docker pull nginx:1.23.4-perl
- sudo docker pull nginx@sha256:55ef01aae23f582e98d9e91075caa0c96d9c2f2754d24cb0f2be5ca26620a212
- # 先改一个tag
- sudo docker tag nginx:1.23.4-perl jianglingyu/test_repository:666
- sudo docker push jianglingyu/test_repository:666
一般去hub.docker.com网站里找,较少使用命令。
- sudo docker search nginx
- # 查找星数大于10的nginx
- sudo docker search -f stars=10 nginx
sudo docker logout
- sudo docker images
- # 查找带有nginx相关的镜像
- sudo docker images nginx
- sudo docker images nginx:1.23.4-perl # 冒号后面必须输入完整
- # 顺带显示sha256摘要信息
- sudo docker images --digests
- # -f代表过滤,比jianglingyu/test_repository:666早创建的镜像
- sudo docker images -f before=jianglingyu/test_repository:666
sudo docker image inspect jianglingyu/test_repository:666
比如启动nginx容器,就可以通过该命令查看nginx的启动方式(Cmd字段)和端口(ExposedPorts字段)
和docker push配合使用
- sudo docker tag nginx:1.23.4-perl jianglingyu/test_repository:666
- # 或者使用image id进行打标签
- sudo docker tag 15578d966674 jianglingyu/test_repository:666
- # 推送
- sudo docker push jianglingyu/test_repository:666
- sudo docker rmi hub.c.163.com/library/tomcat:latest
- sudo docker rmi -f hub.c.163.com/library/tomcat:latest # 强制删除
- # 删除镜像时,存在引用
- [jly@VM-4-6-centos ~]$ sudo docker rmi hello-world:latest
- Error response from daemon: conflict: unable to remove repository reference "hello-world:latest" (must force) - container 2e4b11735cb5 is using its referenced image d2c94e258dcb
- [jly@VM-4-6-centos ~]$ sudo docker rm 2e4b11735cb5 # 移除容器
- 2e4b11735cb5
- [jly@VM-4-6-centos ~]$ sudo docker rmi hello-world:latest
- Untagged: hello-world:latest
- Untagged: hello-world@sha256:4bd78111b6914a99dbc560e6a20eab57ff6655aea4a80c50b0c5491968cbc2e6
- Deleted: sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a
- Deleted: sha256:ac28800ec8bb38d5c35b49d45a6ac4777544941199075dff8c4eb63e093aa81e
- # 打包成tar
- [jly@VM-4-6-centos busybox]$ sudo docker save -o busybox.tar busybox:1.36
- [jly@VM-4-6-centos busybox]$ ls
- busybox.tar
- # 将多个镜像一起打包成tar
- [jly@VM-4-6-centos busybox]$ sudo docker save -o busyboxs.tar busybox:1.36 ccr.ccs.tencentyun.com/jianglingyu/my_busybox:V1.1
- [jly@VM-4-6-centos busybox]$ ls
- busyboxs.tar busybox.tar
sudo docker load -i busyboxs.tar -q # -q精简信息,不加q显示还原进度
两台服务器之间通过ssh传输文件scp myfile root@xxx.xxx.xxx.xxx:/filepath
docker history显示每个层(layer)的创建者、创建时间、大小等信息。
- [jly@VM-4-6-centos busybox]$ sudo docker history busybox:1.36
- IMAGE CREATED CREATED BY SIZE COMMENT
- 3f57d9401f8d 2 weeks ago CMD ["sh"] 0B buildkit.dockerfile.v0
- <missing> 2 weeks ago ADD busybox.tar.xz / # buildkit 4.26MB buildkit.dockerfile.v0
- [jly@VM-4-6-centos busybox]$ sudo docker image prune
- WARNING! This will remove all dangling images.
- Are you sure you want to continue? [y/N] y
- Total reclaimed space: 0B
也可以加-a选项,将会清理所有不使用的镜像。
docker image prune命令可以删除以下类型的镜像
这个命令的目的是为了清理系统中不再需要的镜像,以节省磁盘空间。在使用之前,需要确保没有重要的镜像会被删除,因为这个命令是不可逆的。
这个命令和docker rmi的区别在于docker rmi更倾向于手动删除某个镜像。
○ -d: 后台运行容器,并返回容器 ID;
○ -i: 以交互模式运行容器,通常与 -t 同时使用;
○ -P: 随机端口映射,容器内部端口随机映射到主机的端口
○ -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
○ -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
○ --name="nginx-lb": 为容器指定一个名称;
○ -h "mars": 指定容器的 hostname;
○ -e username="ritchie": 设置环境变量;
○ --cpuset-cpus="0-2" or --cpuset-cpus="0,1,2": 绑定容器到指定 CPU 运行;
○ -m :设置容器使用内存最大值;
○ --network="bridge": 指定容器的网络连接类型;
○ --link=[]: 添加链接到另一个容器;
○ --volume , -v: 绑定一个卷
○ --rm :shell 退出的时候自动删除容器
- sudo docker ps # 查看当前正在运行的容器
- sudo docker ps -a # 曾经运行过或者已创建未运行的容器
- sudo docker pull centos:7 # 拉取镜像
- sudo docker run centos:7 # 运行centos7容器,执行默认的启动命令(/bin/bash,会直接退出)
- sudo docker run -it centos:7 bash # 启动一个centos7交互式的 Bash 终端i:交互模式运行终端,为容器重新分配一个伪输入终端
- sudo docker run nginx:1.23.4-perl # 前台运行nginx(不退出),执行默认的启动命令(启动nginx)
- sudo docker run -d nginx:1.23.4-perl # 后台运行nginx
- [jly@VM-4-6-centos nginx]$ sudo docker run -d -p 8050:80 nginx:1.23.4-perl
- 71400b8910d6a5aeabc81e68c83d4e4b2c01e256364bf68933f640ca1762ba87
如果没有用-p将端口映射出来:sudo docker run -d nginx:1.23.4-perl,外部浏览器是访问不到容器的nginx的端口的。
当然也可以用sudo docker run -d -P nginx:1.23.4-perl来随机映射端口sudo docker ps查看随机分配的端口。
sudo docker run --name myNginx nginx:1.23.4-perl
- [jly@VM-4-6-centos ~]$ sudo docker run -d --name myNginx --cpuset-cpus="0-9" nginx:1.23.4-perl
- docker: Error response from daemon: Requested CPUs are not available - requested 0-9, available: 0-1.
- See 'docker run --help'. # 可用核心数为0-1
-
- [jly@VM-4-6-centos ~]$ sudo docker run -d --name MyNginx --cpuset-cpus="0-1" nginx:1.23.4-perl
- c5720d9ba305e8e48d59653d926d2993315e2a389c831e8e3455361b5b8bffd9
- [jly@VM-4-6-centos ~]$ sudo docker run -d --name MyNginx1 -m 500m nginx:1.23.4-perl
- 89c9282f55bee6f4d3d83a7bd4827bac1677849ed32c2d40b190fb8d9a8eb2db
- # 运行centos7容器
- [jly@VM-4-6-centos ~]$ sudo docker run -it --name MyCentOS7 centos:7 bash
- [root@32fc6c8c5808 /]#
- # 运行第二个centos7容器并对链接的容器改名
- [jly@VM-4-6-centos ~]$ sudo docker run -it --name MyCentOS7_1 --link MyCentOS7:changeName centos:7 bash
- # 第二个容器ping第一个容器,可以ping通。
- [root@6bf58364ef6e /]# ping changeName
- PING changeName (172.17.0.4) 56(84) bytes of data.
- 64 bytes from changeName (172.17.0.4): icmp_seq=1 ttl=64 time=0.101 ms
- 64 bytes from changeName (172.17.0.4): icmp_seq=2 ttl=64 time=0.050 ms
- 64 bytes from changeName (172.17.0.4): icmp_seq=3 ttl=64 time=0.053 ms
- # 第一个容器ping第二个容器,ping不通(因为创建第一个容器的时候没有--link链接)
- [root@32fc6c8c5808 /]# ping MyCentOS7_1
- ping: MyCentOS7_1: Name or service not known
- # 查看两个容器的/etc/hosts目录,在这个文件中添加ip即可
- 第一个:
- [root@32fc6c8c5808 /]# cat /etc/hosts
- 127.0.0.1 localhost
- ::1 localhost ip6-localhost ip6-loopback
- fe00::0 ip6-localnet
- ff00::0 ip6-mcastprefix
- ff02::1 ip6-allnodes
- ff02::2 ip6-allrouters
- 172.17.0.4 32fc6c8c5808
- 第二个:
- [root@6bf58364ef6e /]# cat /etc/hosts
- 127.0.0.1 localhost
- ::1 localhost ip6-localhost ip6-loopback
- fe00::0 ip6-localnet
- ff00::0 ip6-mcastprefix
- ff02::1 ip6-allnodes
- ff02::2 ip6-allrouters
- 172.17.0.4 changeName 32fc6c8c5808 MyCentOS7 # 保存第一个容器的ip
- 172.17.0.5 6bf58364ef6e # 自己的ip
带--rm,退出后并不会留下记录:
- [jly@VM-4-6-centos ~]$ sudo docker run -it --name MyCentOS7_2 --rm centos:7
- [root@da44dd4bf0e1 /]# exit
- exit
- [jly@VM-4-6-centos ~]$ sudo docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 6bf58364ef6e centos:7 "bash" 3 hours ago Exited (127) 3 hours ago MyCentOS7_1
- 32fc6c8c5808 centos:7 "bash" 3 hours ago Exited (127) 2 hours ago MyCentOS7
- 89c9282f55be nginx:1.23.4-perl "/docker-entrypoint.…" 3 hours ago Exited (0) 32 minutes ago MyNginx1
- c5720d9ba305 nginx:1.23.4-perl "/docker-entrypoint.…" 3 hours ago Up 3 hours 80/tcp MyNginx
- sudo docker ps
- sudo docker ps -a # 曾经运行过或者已创建未运行的容器
- sudo docker ps -as # s:显示大小
- # 启动一个nginx
- [jly@VM-4-6-centos ~]$ sudo docker run -d -p 8051:80 --name myNginx nginx:1.23.4-perl
- e965415b65e7d0a02be0ec0ce0c640f7828113520b3ead38a5ac9c7b284c7bcd
- # 直接docker logs查看日志
- [jly@VM-4-6-centos ~]$ sudo docker logs myNginx
- /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
- /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
- /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
- 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
- 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
- /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
- /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
- /docker-entrypoint.sh: Configuration complete; ready for start up
- 2024/02/17 15:41:24 [notice] 1#1: using the "epoll" event method
- 2024/02/17 15:41:24 [notice] 1#1: nginx/1.23.4
- 2024/02/17 15:41:24 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
- 2024/02/17 15:41:24 [notice] 1#1: OS: Linux 3.10.0-1160.71.1.el7.x86_64
- ......
- # 加个-f,持续输出(刷新nginx的主页,会持续输出log)
- [jly@VM-4-6-centos ~]$ sudo docker logs -f myNginx
- # 打印最新的前5条log
- [jly@VM-4-6-centos ~]$ sudo docker logs -f -n 5 myNginx
关键参数:
--sig-proxy:是否将所有信号代理,默认是true(退出将导致容器退出),若设置为false,则不会影响容器。
连接容器后将会接管该容器的标准输入、标准输出、标准错误,所以网页端一刷新,终端立马接收到相关log信息。若按下ctrl+c,该容器将会退出:
如果在退出时不想退出容器,则需要加上--sig-proxy=false将信号代理:
[jly@VM-4-6-centos ~]$ sudo docker attach --sig-proxy=false myNginx
○ -d: 分离模式,在后台运行;
○ -i: 以交互模式运行容器,通常与 -t 同时使用;
○ -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
○ -e:设置环境变量;
○ -u/--user: 指定用户来执行命令
○ -w/--workdir:指定工作目录
- # 进入容器,输入命令
- [jly@VM-4-6-centos ~]$ sudo docker exec -it myNginx bash
- root@e965415b65e7:/# curl 127.0.0.1 # 通过 HTTP 请求访问本地主机
- <!DOCTYPE html>
- <html>
- <head>
- ......
- # 持续在容器中输入命令
- root@e965415b65e7:/# nginx -v
- nginx version: nginx/1.23.4
- # 输入exit退出
- root@e965415b65e7:/# exit
- exit
- [jly@VM-4-6-centos ~]$
-
- # 这两种方式都可以在容器中输入单条命令
- [jly@VM-4-6-centos ~]$ sudo docker exec myNginx nginx -v
- nginx version: nginx/1.23.4
- [jly@VM-4-6-centos ~]$ sudo docker exec -it myNginx nginx -v
- nginx version: nginx/1.23.4
- [jly@VM-4-6-centos ~]$ sudo docker stop myNginx
- myNginx
- [jly@VM-4-6-centos ~]$ sudo docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- [jly@VM-4-6-centos ~]$ sudo docker start myNginx
- myNginx
- [jly@VM-4-6-centos ~]$ sudo docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- e965415b65e7 nginx:1.23.4-perl "/docker-entrypoint.…" 23 hours ago Up 7 seconds 0.0.0.0:8051->80/tcp, :::8051->80/tcp myNginx
它可以重启运行、停止甚至已退出的容器。
- # 优雅的重启,给足容器时间善后资源
- [jly@VM-4-6-centos ~]$ sudo docker restart MyCentOS7
- MyCentOS7
- # 不优雅的重启,不管容器是否在运行,先发个kill -9直接杀死再重启
- [jly@VM-4-6-centos ~]$ sudo docker restart -s -9 MyCentOS7
- MyCentOS7
docker stop发送温柔的SIGTERM信号,docker kill发送暴力的SIGKILL信号。
sudo docker kill
例如有些容器如Nginx中就没有ps命令,要查看容器的进程信息就需要用docker top
- [jly@VM-4-6-centos ~]$ sudo docker top myNginx
- [jly@VM-4-6-centos ~]$ sudo docker stats
- [jly@VM-4-6-centos ~]$ sudo docker stats # 实时刷新
- [jly@VM-4-6-centos ~]$ sudo docker stats myNginx # 实时刷新
- [jly@VM-4-6-centos ~]$ sudo docker stats -a # 连已经停止的容器都打印出来,没啥用
- [jly@VM-4-6-centos ~]$ sudo docker stats --no-stream # 快照形式
- CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
- e965415b65e7 myNginx 0.00% 2.336MiB / 1.952GiB 0.12% 28.5kB / 21.4kB 3.11MB / 0B 3
- [jly@VM-4-6-centos ~]$ sudo docker container inspect myNginx
- [
- {
- "Id": "e965415b65e7d0a02be0ec0ce0c640f7828113520b3ead38a5ac9c7b284c7bcd",
- "Created": "2024-02-17T15:41:20.359522338Z",
- "Path": "/docker-entrypoint.sh",
- "Args": [
- "nginx",
- "-g",
- "daemon off;"
- ],
- "State": {
- "Status": "running",
- ......
- [jly@VM-4-6-centos ~]$ sudo docker port myNginx
- 80/tcp -> 0.0.0.0:8051
- 80/tcp -> [::]:8051
- # 将容器myNginx中,路径为/usr/share/nginx/html/index.html的文件拷贝至宿主机当前目录
- [jly@VM-4-6-centos ~]$ sudo docker cp myNginx:/usr/share/nginx/html/index.html .
- Successfully copied 2.56kB to /home/jly/.
C:修改过;A:新增;D:删除
- [jly@VM-4-6-centos ~]$ sudo docker diff myNginx
- C /etc
- C /etc/nginx
- C /etc/nginx/conf.d
- C /etc/nginx/conf.d/default.conf
- C /run
- A /run/nginx.pid
- C /var
- C /var/cache
- C /var/cache/nginx
- A /var/cache/nginx/uwsgi_temp
- A /var/cache/nginx/client_temp
- A /var/cache/nginx/fastcgi_temp
- A /var/cache/nginx/proxy_temp
- A /var/cache/nginx/scgi_temp
- C /root
- A /root/.bash_history
○ -a: 提交的镜像作者;
○ -c: 使用Dockerfile指令创建镜像,可以修改启动指令;
○ -m: 提交时的说明文字;
○ -p:在commit时,将容器暂停。
- # 查看当前正在运行的镜像
- [jly@VM-4-6-centos ~]$ sudo docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- e965415b65e7 nginx:1.23.4-perl "/docker-entrypoint.…" 47 hours ago Up 21 minutes 0.0.0.0:8051->80/tcp, :::8051->80/tcp myNginx
- # 由运行中的容器myNginx创建一个新的镜像myNginx my_new_nginx
- [jly@VM-4-6-centos ~]$ sudo docker commit myNginx my_new_nginx:v1.0
- sha256:fa1552088c2d80faee9436b80ccf5927c14b8a7995f88a5c69d5301540b395c5
- # 带参数
- sudo docker commit -a 'jianglingyu' -m 'add files' -c 'CMD ["tail", "-f", "/etc/hosts"]' -p myNginx my_new_nginx:v2.0
每次commit,生成的镜像会保存当前容器的一些修改。
通过剥夺容器进程的时间片来暂停进程。
- # 暂停
- [jly@VM-4-6-centos ~]$ sudo docker pause myNginx
- myNginx
- # 取消暂停
- [jly@VM-4-6-centos ~]$ sudo docker unpause myNginx
- myNginx
docker export命令仅导出容器的文件系统,不包括容器的元数据(例如标签、端口映射、卷等)或容器的运行状态。如果还原时需要这些信息,使用docker save/docker load来保存还原。
- # 为容器打包
- [jly@VM-4-6-centos ~]$ sudo docker export -o myNginx.tar myNginx
- # 将导出的包还原为镜像
- [jly@VM-4-6-centos ~]$ sudo docker import myNginx.tar myNginxImpoet:v1.0
- # -c 修改镜像的启动命令 -m描述信息
- [jly@VM-4-6-centos ~]$ sudo docker import -c 'CMD ["nginx", "-g", "daemon off;"]' -m 'new commit' myNginx.tar myNginxImpoet:v1.0
- # docker wait容器,在被kill之后,退出码137
- [jly@VM-4-6-centos ~]$ sudo docker wait myNginx1
- 137
- # 杀掉容器
- [jly@VM-4-6-centos ~]$ sudo docker kill myNginx1
- myNginx
[jly@VM-4-6-centos ~]$ sudo docker rename myNginx myNginx1
[jly@VM-4-6-centos ~]$ sudo docker container prune
○ --cpus: cpu数量;
○ --cpuset-cpus: 使用哪几个cpu;
○ -m/--memory: 内存限制;
○ --memory-swap:交换内存;
○ --cpu-period:用来指定容器对cpu的使用要在多长时间做一次重新分配;
○ --cpu-quota:用来指定这个周期内,最多可以有多少时间跑这个容器。
- # 更新容器内存限制为500m
- [jly@VM-4-6-centos ~]$ sudo docker update --memory 500m --memory-swap -1 myNginx
- myNginx
- sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
- # 刷新本地存储库元数据缓存
- yum makecache
- sudo yum install nginx -y
- # 启动nginx,可在浏览器中输入服务器IP地址来查看首页
- sudo nginx
命令安装:
- # centos下载busybox
- [jly@VM-4-6-centos busybox]$ wget https://busybox.net/downloads/binaries/1.28.1-defconfig-multiarch/busybox-x86_64 --no-check-certificat
- # 加上可执行权限
- [jly@VM-4-6-centos busybox]$ chmod +x busybox
- # 使用busybox
- [jly@VM-4-6-centos busybox]$ ./busybox ls
- busybox
使用docker安装:
- # 下载docker镜像
- sudo docker pull busybox:1.36
- # 打标签
- sudo docker tag busybox:1.36 jianglingyu/busybox:v1.0
- # 登录
- sudo docker login
- # push镜像到自己的仓库-a代表全部push
- sudo docker push jianglingyu/busybox:v1.0 -a
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。