前言
需要知道容器、镜像原理可以阅读这篇文章--->docker概述及镜像管理
容器核心指令
- docker container --help:查看帮助文档
- docker ps:查看运行中的容器列表,-a:查看所有容器
- docker run:创建并运行容器
- 例如:docker run -d -p 80:80 --name nginx_1 nginx:latest
复制代码
- docker create:创建容器 -- name
- docker start :启动容器
- docker restart:重启容器
- docker stop:停止容器
- docker kill:用于结束指定的容器,stop无法关闭,可以使用kill
- docker rm:删除容器 -f 强制删除容器
- docker exec:进入正在运行的容器(分配一个终端,和-it搭配起来使用)
- docker attach:进入正在运行的容器,使用相同的终端。
- docker cp:宿主机与容器之间文件传递
- docker logs:查看容器日志
- docker top:查看指定容器进程信息
- docker stats:查看所有容器的cpu,内存,磁盘,网络,进程信息
- docker update:修改运行中的容器的参数,cpu限制,内存限制,修改重启规则
- docker pause/unpause:将容器挂起/取消挂起,类似虚拟机的挂起
- docker commit:将容器保存为镜像
- docker export:将容器导出
- docker import:将export导出的容器导入为镜像
- docker ps -f:过滤容器
docker run指令详解
docker run指令过程
使用docker run时会有以下的几个步骤
- 如果本地没有镜像的话,会使用docker pull指令将镜像拉取下来
- 然后通过docker create指令创建容器
- 最后通过docker start指令运行容器
- 最后通过映射的端口进行访问
docker run常用选项
- -d:后台运行
- -p:指定映射的端口号,宿主机端口:容器端口
- --name:指定容器的名字
- -i:进入交互模式,进入这个容器中,一般与-t一起使用
- -t:分配一个终端
- -v:挂载数据卷
- -e:创建修改容器的环境变量
- --restart:设置容器的重启策略
- --rm:容器退出时自动删除容器
- --cpus:限制容器可以使用的 CPU 数量
- --memory:限制容器可以使用的内存量
- --net:连接容器到用户定义的网络
- --link:添加链接到另一个容器(不推荐使用,建议使用用户定义的网络)
- --user:指定容器运行时的用户
- --workdir:设置容器内的工作目录
容器前台执行转为后台进程运行
当我们使用docker run命令时,没有加上-d选项,容器会进入前台进程模式,这个时候当前终端会被一直占用,例如下面这样:- [root@master ~]# docker run -it -p 80:80 nginx
- /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: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
- /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
- 2025/04/12 06:22:49 [notice] 1#1: using the "epoll" event method
- 2025/04/12 06:22:49 [notice] 1#1: nginx/1.27.4
- 2025/04/12 06:22:49 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
- 2025/04/12 06:22:49 [notice] 1#1: OS: Linux 5.15.0-134-generic
- 2025/04/12 06:22:49 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
- 2025/04/12 06:22:49 [notice] 1#1: start worker processes
- 2025/04/12 06:22:49 [notice] 1#1: start worker process 28
复制代码 这个时候我们应该怎么才能让其转为后台进程运行呢?
使用CTRL+P+Q的组合键,可以让其转为后台进程
示例:运行nginx容器,指定1234端口运行
- [root@master ~]# docker run -d -p 1234:80 --name nginx_1234 nginx
- 93e4c333ecb5343f1192e927b5f737d642664853d27b78b21dc666be2e965cf5
复制代码 示例:进入nginx容器,查看主配置文件
- # /bin/bash指定分配一个终端
- [root@master ~]# docker exec -it nginx_1234 /bin/bash
- root@93e4c333ecb5:/# cat /etc/nginx/
- conf.d/ fastcgi_params mime.types modules/ nginx.conf scgi_params uwsgi_params
- root@93e4c333ecb5:/# cat /etc/nginx/nginx.conf
- user nginx;
- worker_processes auto;
- error_log /var/log/nginx/error.log notice;
- pid /var/run/nginx.pid;
- events {
- worker_connections 1024;
- }
- http {
- include /etc/nginx/mime.types;
- default_type application/octet-stream;
- log_format main '$remote_addr - $remote_user [$time_local] "$request" '
- '$status $body_bytes_sent "$http_referer" '
- '"$http_user_agent" "$http_x_forwarded_for"';
- access_log /var/log/nginx/access.log main;
- sendfile on;
- #tcp_nopush on;
- keepalive_timeout 65;
- #gzip on;
- include /etc/nginx/conf.d/*.conf;
- }
复制代码 容器的重启策略
Docker 容器的重启策略是指当容器退出时,Docker 守护进程如何处理容器的行为。重启策略可以确保容器在失败或退出时自动重启,从而提高服务的可用性和稳定性。
Docker 提供了几种不同的重启策略,可以通过 --restart 标志在运行容器时指定。
- 默认不加--restart:不会自动重启
- always:自动重启
- unless-stopped:只在容器关闭,停止的时候重启
- on-failure:只在失败的时候重启
示例:设置容器自动重启- [root@master ~]# docker run -d -p 80:80 --name nginx --restart always nginx
- 471bd6bdcec1957b613951cebd3c9caa34f6268569c6e5acc286441793a49598
复制代码 查看容器日志
使用docker logs命令查看日志,其中有几个选项参数:
- -f:查看实时日志,类似tail -f
- --tail:指定查看最近x行的日志,--tail 20,查看最近20行的日志
- --since:--since 5m 查看最近5分钟的日志,--since "2024-01-01T12:30:30" 查看指定时间到现在的日志
- --until:指定日志时间,一般查看指定范围内的内容,使用--since开始,--until结束
示例:查看最近的两行日志
- [root@master ~]# docker logs --tail 2 nginx
- 2025/04/12 06:33:48 [notice] 1#1: start worker processes
- 2025/04/12 06:33:48 [notice] 1#1: start worker process 28
复制代码 容器运行指定环境变量
使用-e选项指定环境变量- # -e指定环境变量APP=nginx_huangSir
- [root@master ~]# docker run -d -p 80:80 --name nginx --restart always -e APP=nginx_huangSir nginx
- ad73f7b633e1bb3f298492753f980073d97a5823405c77cada43923a9feae241
- # 查看容器内部的环境变量
- [root@master ~]# docker exec -it nginx env|grep APP
- APP=nginx_huangSir
复制代码 在我们运行MySQL时,不指定环境变量会报错- [root@master ~]# docker run -d -p 3306:3306 --name mysql --restart always mysql:5.7
- ee235dc693b910eb76f1318b276e151a63bfb4b4526a54efa1cc20f3a5b4f6af
- [root@master ~]# docker logs mysql
- 2025-04-12 06:42:08+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
- You need to specify one of the following as an environment variable:
- - MYSQL_ROOT_PASSWORD
- - MYSQL_ALLOW_EMPTY_PASSWORD
- - MYSQL_RANDOM_ROOT_PASSWORD
复制代码 如何解决呢?我们只需要指定其中一个环境变量即可- [root@master ~]# docker run -d -p 3306:3306 --name mysql --restart always -e MYSQL_ROOT_PASSWORD=root mysql:5.7
- f06870615801642a61952a8fb9d725135506129e256443515116bad88b76d3c0
- # 查看容器,发现正常启动
- [root@master ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- f06870615801 mysql:5.7 "docker-entrypoint.s…" 19 seconds ago Up 18 seconds 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060/tcp mysql
复制代码 docker的exec和attach的区别
共同点:
都是进入已经运行的容器内部
区别
exec:
- 容器不需要分配终端(运行容器时不需要加-it选项)
- 每个连接互不影响
attach
- 容器必须要分配个终端(运行容器时必须加上-it选项)
- 每个连接所有的操作与输出都是一致的
宿主机与容器之间的文件互传docker cp
docker cp指令可以使宿主机的文件传输到容器中,也可以使容器的文件传输到宿主机中
示例:从容器复制文件到宿主机:- #这将从名为 my_container 的容器中复制 /path/to/file 文件到宿主机的 /host/path 目录。
- docker cp my_container:/path/to/file /host/path
复制代码 示例:从宿主机复制文件到容器:- docker cp /host/path/file my_container:/path/to/file
复制代码 查看所有容器的cpu、内存、磁盘、网络、进程等信息
可以使用docker stats命令- [root@master ~]# docker stats
复制代码
容器的export和import
类似镜像的save和load- #导出
- [root@master ~]# docker export mysql -o /data/docker/images/mysql.tar
- [root@master ~]# ll /data/docker/images/mysql.tar
- -rw------- 1 root root 495261184 Apr 12 15:13 /data/docker/images/mysql.tar
- #导入为镜像,导入的镜像默认没有名称和tag
- [root@master ~]# docker import /data/docker/images/mysql.tar
- sha256:4e93c24f904dcf1f69db34b14766e60c51baa2e564bc5ed4c8140bb338238a71
- [root@master ~]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- <none> <none> 4e93c24f904d 5 seconds ago 477MB
- #导入镜像,指定名称和tag
- [root@master ~]# docker import /data/docker/images/mysql.tar mysql:5.7.1
- sha256:2ede68ede4e15f33ae11523de116df77beb435fbd09ce88b8a37a238bca944e2
- [root@master ~]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- mysql 5.7.1 2ede68ede4e1 3 seconds ago 477MB
复制代码 修改容器docker update
docker update可以修改容器的重启策略、内存、cpu等信息,不能修改容器的端口号、名称等相关信息
示例:更新容器的相关重启策略- docker update --memory 512m my_container
复制代码 启动容器时设置容器的相关资源限制
- docker run -d --name container_name -p 80:80 --cpu 2 --memory 512m my_container
复制代码 容器的端口映射
使用docker的时候,外界访问docker容器中的服务或端口,需要使用端口映射,本质类似于iptables防火墙的端口映射。
什么情况下会使用端口映射呢?
- 容器需要被外界访问(80端口),需要暴露在外界的一个端口
- 用户通过端口访问容器中的某个端口
容器端口映射原理
- 容器网络命名空间:每个 Docker 容器都在其自己的网络命名空间中运行,这意味着容器内的网络栈与宿主机的网络栈是隔离的。容器内部的服务只能通过容器的 IP 地址访问。
- 端口映射规则:当你创建或运行一个 Docker 容器时,可以通过 -p 或 --publish 选项指定端口映射规则。这个规则告诉 Docker 如何将宿主机的端口映射到容器的端口。
- 虚拟网络接口:Docker 在宿主机上创建一个虚拟网络接口(如 veth 接口),这个接口连接了宿主机和容器的网络命名空间。Docker 还使用 iptables 或 nftables 规则来管理数据包的路由。
- 数据包转发:当外部请求到达宿主机的映射端口时,Docker 通过虚拟网络接口和 iptables/nftables 规则将数据包转发到容器的内部端口。
容器一对一端口映射
使用-p选项映射,-p 宿主机端口:容器端口
示例:将主机的80和443端口映射到nginx容器- docker run -d --name nginx_80 -p 80:80 -p 443:443 --restart always nginx:1.24
复制代码 容器映射多个端口
第一种方案,一个一个写
第二种方案:指定范围
示例:- [root@master ~]# docker run -d --name nginx_test -p 8080-8090:80-90 --restart always nginx
- c32c696bdefdf980983ebdba3fba06eff915a9758f2c5ec3d945c10d78d6c194
- [root@master ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- c32c696bdefd nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp, 0.0.0.0:8081->81/tcp, [::]:8081->81/tcp, 0.0.0.0:8082->82/tcp, [::]:8082->82/tcp, 0.0.0.0:8083->83/tcp, [::]:8083->83/tcp, 0.0.0.0:8084->84/tcp, [::]:8084->84/tcp, 0.0.0.0:8085->85/tcp, [::]:8085->85/tcp, 0.0.0.0:8086->86/tcp, [::]:8086->86/tcp, 0.0.0.0:8087->87/tcp, [::]:8087->87/tcp, 0.0.0.0:8088->88/tcp, [::]:8088->88/tcp, 0.0.0.0:8089->89/tcp, [::]:8089->89/tcp, 0.0.0.0:8090->90/tcp, [::]:8090->90/tcp nginx_test
复制代码 容器随机映射端口:-P(大写的P)
示例:- [root@master ~]# docker run -d -P --name nginx_P --restart always nginx
- 0e5614dca0bc9e400328ec2bbcc57772a1b276e8e1a6a5987fd7de2727b3c71b
- [root@master ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 0e5614dca0bc nginx "/docker-entrypoint.…" 2 seconds ago Up 2 seconds 0.0.0.0:32768->80/tcp, [::]:32768->80/tcp
复制代码 容器运行指定端口映射
不指定-p选项,不会对外暴漏端口号
示例:- [root@master ~]# docker run -d --name nginx_port nginx
- 06271faf765679d2efef23fbba28d6a08ed2bc6253057cb458b46c3b4df1bc6a
- [root@master ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 06271faf7656 nginx "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 80/tcp nginx_port
- [root@master ~]# curl localhost:80
- curl: (7) Failed to connect to localhost port 80 after 0 ms: Connection refused
复制代码 容器数据持久化-数据卷挂载
如果容器崩了,容器被误删除了,容器中的数据将会丢失,接下来解决数据不丢
如何解决数据持久化问题?数据卷挂载,让数据永久保存在宿主机中,这个时候我们需要使用存储卷
我们创建容器时可以使用-v选项指定容器的数据挂载到磁盘的哪个位置
案例:创建指定挂载目录并完成数据库持久化
- # 查看容器数据卷挂载位置
- [root@master ~]# docker inspect mysql:5.7 | jq .[].Config.Volumes
- {
- "/var/lib/mysql": {}
- }
- #创建挂载目录
- [root@master ~]# mkdir -p /data/docker/mysql
- #创建容器
- [root@master ~]# docker run -d -p 3306:3306 --name mysql -v /data/docker/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --restart always mysql:5.7
- 3da50987485b298a0622132650226b21be2e55f10f30536c2f281dff1058893f
- #查看挂载目录
- [root@master ~]# ll /data/docker/mysql/
- total 188484
- drwxr-xr-x 5 999 root 4096 Apr 12 15:38 ./
- drwxr-xr-x 4 root root 4096 Apr 12 15:36 ../
- -rw-r----- 1 999 docker 56 Apr 12 15:38 auto.cnf
- -rw------- 1 999 docker 1680 Apr 12 15:38 ca-key.pem
- -rw-r--r-- 1 999 docker 1112 Apr 12 15:38 ca.pem
- -rw-r--r-- 1 999 docker 1112 Apr 12 15:38 client-cert.pem
- -rw------- 1 999 docker 1680 Apr 12 15:38 client-key.pem
- -rw-r----- 1 999 docker 1318 Apr 12 15:38 ib_buffer_pool
- -rw-r----- 1 999 docker 50331648 Apr 12 15:38 ib_logfile0
- -rw-r----- 1 999 docker 50331648 Apr 12 15:38 ib_logfile1
- -rw-r----- 1 999 docker 79691776 Apr 12 15:38 ibdata1
- -rw-r----- 1 999 docker 12582912 Apr 12 15:38 ibtmp1
- drwxr-x--- 2 999 docker 4096 Apr 12 15:38 mysql/
- lrwxrwxrwx 1 999 docker 27 Apr 12 15:38 mysql.sock -> /var/run/mysqld/mysqld.sock
- drwxr-x--- 2 999 docker 4096 Apr 12 15:38 performance_schema/
- -rw------- 1 999 docker 1676 Apr 12 15:38 private_key.pem
- -rw-r--r-- 1 999 docker 452 Apr 12 15:38 public_key.pem
- -rw-r--r-- 1 999 docker 1112 Apr 12 15:38 server-cert.pem
- -rw------- 1 999 docker 1676 Apr 12 15:38 server-key.pem
- drwxr-x--- 2 999 docker 12288 Apr 12 15:38 sys/
复制代码 案例:创建数据卷空间并完成数据库持久化
做数据持久化,不关注数据放在哪里- #创建数据卷
- [root@master ~]# docker volume create mysql_data
- mysql_data
- #查看数据卷
- [root@master ~]# docker volume ls
- DRIVER VOLUME NAME
- local 5b0ac47545efbe8795586cb4c419ca104dfe7814f59ff83c323be63d5eefd879
- local beba4268b0c7b99ef198fc297ba35f47b5a510bf552471c1cd580195039503ee
- local mysql_data
- #创建容器
- [root@master ~]# docker run -d -p 3306:3306 --name mysql -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --restart always mysql:5.7
- 594a321ec3fa07da604bbc646b8cb2ad3041d3019479e9cdec43e0ce7528c8e2
- #查看数据卷空间的详细信息
- [root@master ~]# docker inspect mysql_data
- [
- {
- "CreatedAt": "2025-04-12T15:42:17+08:00",
- "Driver": "local",
- "Labels": null,
- #存储卷的实际存放位置
- "Mountpoint": "/var/lib/docker/volumes/mysql_data/_data",
- "Name": "mysql_data",
- "Options": null,
- "Scope": "local"
- }
- ]
- #删除存储卷,当卷被挂载时,删除失败
- [root@master ~]# docker volume rm mysql_data
- Error response from daemon: remove mysql_data: volume is in use - [594a321ec3fa07da604bbc646b8cb2ad3041d3019479e9cdec43e0ce7528c8e2]
复制代码 数据卷更多使用方法:https://docs.docker.com/engine/storage/volumes/#when-to-use-volumes
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |