【docker】之容器命令详解~

255 阅读11分钟

1、容器命令总结:

容器命令含义
docker run默认先去本地找镜像,没有就去网上仓库拉取,拉取后建立容器
docker ps查看容器的状态
docker rm删除容器
docker exec进入容器 示例:docker exec -it 容器名字或容器id shell程序
docker cp复制文件。 真机和容器之间,复制文件可以从容器复制到当前,也可以从当前复制到容器
docker --dns IP地址建立容器时,设置dns服务器
--add-host 域名 ip地址在/etc/hosts文件中,加入dns域名解析
docker top 容器id查看容器中的进程
docker stats 容器id查看容器中资源使用情况(动态 一次性的)
docker port 容器查看容器和真机之间的端口映射
-e传递参数

2、docker run 启动容器⭐⭐⭐

docker run 可以启动容器,进入到容器,并随机生成容器ID和名称。

帮助: man docker-run

容器与宿主机共用一个内核。

2.1 命令格式:

 docker run [选项] [镜像名]:tag [shell命令] [参数]

示例:

 docker run -it httpd:latest sh    //sh是精简的系统

2.2 启动容器的流程:

  • 先找本地
  • 本地没有,去官方仓库下载
  • 从官方下载到本地,然后再本地运行。(官方仓库没有,就会报错)

image.png

2.3 docker run 选项⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

docker run 命令含义
docker run -d后台运行
docker run -it 镜像名称:tag 终端i与容器进行交互、t是终端 tty。-it一般不分家
docker run --name容器设置一个名字,指定容器名称
docker run --rm一次性的容器,退出就删除,一般测试时使用
docker run --rm -f强制删除
docker run --restart always一旦意外退出,会自动启动容器
docker run -h设置容器的主机名
docker run -e添加参数

2.3.1 启动容器⭐⭐

  • 前台启动
 docker run nginx      //在真机的前台运行nginx
  • 后台启动 -d:daemon
 docker run -d nginx   //-d是将nginx在真机的后台运行

2.3.2 --restart 设置容器退出后的 启动规则

 docker run -d --restart always httpd
policy 策略说明
no容器不会自动重启。这也是默认设置
on-failure[:max-retries]仅当容器以非零状态退出时才重启
always自动退出就会重启;手动退出不会重启!
unless-stopped无论退出状态如何,始终重启容器,但如果容器之前已被置于停止状态,则在守护进程启动时不要启动它。
 [root@localhost ~]#docker run -d  --restart always   httpd 
 d4e42301e70dd933109ac97c3fab9c287694e76769929e73cc001afc4be42c0a
 ​
 [root@7-2 ~]# docker ps -a
 CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS                     PORTS     NAMES
 d4e42301e70d   httpd     "httpd-foreground"        6 seconds ago    Up 5 seconds               80/tcp    focused_feynman      //开启状态
 [root@7-2 ~]# docker stop d4e42301e70d   //手动关闭
 ​
 [root@7-2 ~]# docker ps -a
 CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS                      PORTS     NAMES
 d4e42301e70d   httpd     "httpd-foreground"        2 minutes ago    Exited (0) 3 seconds ago              focused_feynman    //就会自动关闭,不会重启

image.png

2.3.3 -it 交互终端⭐⭐⭐⭐⭐

系统类的容器,比如busybox、centos7等, 启动后没有执行任何操作,不像 httpd nginx需要持续向外提供服务, 所以系统类的默认是一次性的容器启动就退出

格式:

 docker run 选项  镜像  伪终端

示例:

 docker  run  -it  centos:7       bash             //类似于一次性命令,exit就会退出。
 命令   子命令 选项  镜像:tag  伪终端(因为前面有选项t)

如果,不想只是一次性运行,那么可以用ctrl+q+p命令, (这个命令有延迟性) 退出后,容器仍然可以继续在前台使用。

2.3.4 --name 指定容器名称

注意:每个容器的名称要是唯一的。

 [root@7-2 ~]# docker run -d --name web2 nginx 
 a9e5d28938465e6a36b0c9261e479e97f63a9bb331fd84e099989a309024c7d5

2.3.5 -h设置容器的主机名

 [root@7-2 ~]# docker run -it -h code nginx:1.18 bash
 root@code:/#     //修改主机名为code

主机名不设置的话,默认是容器id

3、docker ps 查看容器 ⭐⭐⭐

3.1 docker ps 选项

ps:process status

docker ps 选项含义
docker ps -a查看所有容器 all
docker ps -a -q-q 查看所有容器的容器id
docker ps -a -s-s 查看所有容器的大小
docker ps -l查看最近一个容器的运行状态
docker ps -f只显示退出状态的容器

小拓展1:怎么

 docker ps -aq | xargs docker rm -f    //批量删除 所有容器
   查看所有容器        强制删除
   
 docker ps -qf status=exited | xargs docker rm -f    //批量删除 退出状态的容器
 ​
 docker ps -qf status=running | xargs docker rm -f    //批量删除 运行状态的容器

3.2 只显示开启状态的容器

 [root@7-2 ~]# docker ps

image.png

3.3 只显示退出状态的容器

 [root@7-2 ~]# docker ps -f status=exited
 ​
 [root@7-2 ~]# docker ps -f status=running    //如果只显示运行状态,运行状态不是up,而是running!!!

image.png

3.4 查看容器内的进程 top

 docker top container 

3.5 查看容器资源使用情况

类似于宿主机上的top命令,是动态的

 格式:
 docker stats 容器名    //注意:中间没有u

拓展:取消动态显示--no-stream

 [root@7-2 ~]# docker stats  --no-stream xenodochial_lewin

3.6 inspect 查看容器详细信息

docker inspect可以查看docker各种对象的详细信息,包括:镜像、容器、网络等

 docker inspect 容器名

拓展:选择性查看 -f

 格式:
 docker inspect -f "{{.字段}}"  容器名   //注意:不要忘了加.点
 ​
 示例:
 [root@7-2 ~]# docker inspect -f "{{Args}}" 0e02e876f4e3
 [nginx -g daemon off;]    //上面Args字段对应的内容

4、docker rm 删除容器

docker rm 可以删除容器,即使容器正在运行当中,也可以被强制删除掉

4.1 rm 选项

选项含义
-f强制
-v数据卷

示例:

 [root@7-2 ~]# docker run --name www1 nginx    //前台运行一个容器,名为www1
 [root@7-2 ~]# docker rm  -f www1     //强制删除www1容器

4.2 容器的开启、停止

 docker start|stop|restart|pause|unpause 容器ID

5、exec 进入正在运行的容器⭐⭐

5.1 attach

不推荐使用,因为终端之间会互相影响

 格式:
 docker attach 容器id

5.2 exec⭐⭐⭐

推荐使用:exec

在运行中的容器启动新进程,可以执行单次命令,以及进入容器测试环境使用此方式,使用exit退出,但容器还在运行。

 格式:
 docker exec 选项 容器id  可执行的命令

示例:

 [root@7-2 ~]# docker exec -it aa bash
 [root@aa909fc8bf8b /]# exit    //这时的退出,只是退出了容器的交互,并不是关闭了容器。
 [root@7-2 ~]# docker ps
 CONTAINER ID   IMAGE      COMMAND                   CREATED             STATUS             PORTS     NAMES
 aa909fc8bf8b   centos:7   "bash"                    About an hour ago   Up About an hour             epic_perlman    //此时,容器仍然正在运行

image.png

6、暴露容器的端口⭐⭐

EXPOSE 暴露端口

docker run 端口选项

选项含义
-P(大)随机暴露端口。把容器中的固定端口 映射成真机的随机端口。端口范围是:32767-65535
-p(小)指定暴露的端口。 80:80 前面的80端口是真机的,后面的80端口是容器的

6.1 -P(大) 暴露随机端口

外部网络的主机无法直接访问容器中网络服务

随机端口范围:32768-65535

 [root@7-2 ~]# docker run -d -P --name www2 nginx    //启动容器www2,并暴露随机端口
 0c836159ed3fa525ee1a6955780ee6b0b0179baccd63284c40e04057c76c230a
 ​
 [root@7-2 ~]# docker port www2   //docker port 可以查看容器的端口映射关系
 80/tcp -> 0.0.0.0:32768
 80/tcp -> [::]:32768
 //以上操作是将容器的80端口,映射到真机的32768端口!!! 
 ​
 [root@7-2 ~]# docker inspect www2
 "IPAddress": "172.17.0.5",    //容器对应的ip地址

小拓展1:查看容器对应的ip地址

 [root@7-2 ~]# docker inspect -f "{{.NetworkSettings.IPAddress}}" www2   //www2是容器名
 172.17.0.5

小拓展2:查看容器端口的映射关系

 docker port 容器id或容器名

6.2 -p(小) 暴露指定端口

 格式:
 docker run -p 宿主机端口:容器端口  镜像
 ​
 示例:
 [root@7-2 ~]# docker run -p 9527:80 httpd
 [root@7-2 ~]# docker port c947b20039c2
 80/tcp -> 0.0.0.0:9527
 80/tcp -> [::]:9527

小拓展:在不删除容器的情况下,怎么修改已经创建的容器端口映射关系?

  • 先停止docker程序
  • 修改json文件

7、查看容器的日志

docker logs 可以查看容器中运行的进程在控制台输出的日志信息

8、容器内部的本地Hosts文件 域名解析

容器会自动将容器的ID 加入自已的/etc/hosts文件中,并解析成容器的IP

 [root@7-2 ~]# docker run -it -h wxy centos:7 bash
 [root@wxy /]# 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.6  wxy    //主机名wxy
 [root@wxy /]# 

image.png

例子: 人为的修改 hosts 文件 --add-host 添加指定信息

 docker run -it --rm --name a1 --add-host www.kgc.com:6.6.6.6 --add-host www.accp.com:9.9.9.9 alpine
 / # 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
 6.6.6.6 www.kgc.com
 9.9.9.9 www.accp.com
 172.17.0.6  c9d86a5cc10f

9、指定DNS 域名解析服务器

容器的dns服务器,默认采用宿主机的dns 地址

可以用下面方式指定其它的DNS地址,将dns地址配置在宿主机:

  • 在容器启动时加选项 --dns=x.x.x.x
  • /etc/docker/daemon.json文件中指定

示例1:

 [root@7-2 ~]# docker run -it --dns 1.1.1.1 --dns 2.2.2.2 centos:7 bash
 [root@02c3d6143c3c /]# cat /etc/hosts    //查看dns
 nameserver 1.1.1.1
 nameserver 2.2.2.2

image.png

10、docker cp 容器内和宿主机之间复制文件

docker cp 命令:表示容器宿主机之间的拷贝

格式语法:

 `语法一:`
 将容器中的文件拷贝到本地:
 docker cp 容器id:容器中要复制的文件  本地文件夹
 ​
 `语法二:`
 将本地文件拷贝到容器:
 docker cp 本地文件   容器id:容器中的文件夹

示例:

 [root@7-3 ~]# docker pull centos    //下载centos镜像
 [root@7-3 ~]# docker run -it centos bash   //交互进入容器
 `新建容器中文件:`
 [root@f9559d24deb1 /]# mkdir /data
 [root@f9559d24deb1 /]# cd /data
 [root@f9559d24deb1 data]# touch aaa.txt | echo  "123123" > aaa.txt
 [root@f9559d24deb1 data]# cat aaa.txt
 123123
 [root@f9559d24deb1 data]# exit
 ​
 [root@7-3 ~]# docker ps
 CONTAINER ID   IMAGE     COMMAND   CREATED              STATUS              PORTS     NAMES
 f9559d24deb1   centos    "bash"    About a minute ago   Up About a minute             thirsty_mclean
 ​
 #将容器中文件拷到本地/data文件
 [root@7-3 ~]# docker cp f9559d24deb1:/data/aaa.txt /data/
 Successfully copied 2.05kB to /data/
 ​
 #将本地文件拷到容器中
 [root@7-3 data]# docker cp /data/test111.sh f9559d24deb1:/data/
 Successfully copied 3.58kB to f9559d24deb1:/data/

小拓展1:格林威治时间如何修改时区

 [root@f9559d24deb1 data]# ls -l /etc/localtime    //查看时间
 lrwxrwxrwx 1 root root 25 Sep 15  2021 /etc/localtime -> ../usr/share/zoneinfo/UTC    //软链接
 [root@f9559d24deb1 data]# rm  -rf /etc/localtime    //删除软链接
 [root@f9559d24deb1 data]# ln -s /usr/share/zoneinfo/Asia/Shanghai   /etc/localtime    //重新做软链接,选择上海的时区
 [root@f9559d24deb1 data]# ls -l /etc/localtime    //查看
 lrwxrwxrwx 1 root root 33 Jul 31 20:36 /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai
 [root@f9559d24deb1 data]# date
 Wed Jul 31 20:37:30 CST 2024

11、容器传递参数

有些容器运行时,需要传递变量。

11.1 方法一:-e 传递

可以使用 -e <参数> 或 --env-file <参数文件> 实现

 [root@7-2 ~]# docker pull mysql:5.7.29   //拉取镜像
 [root@7-2 ~]# docker run --name m1 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wpuser -e MYSQL_PASSWORD=123456 -d -p 3306:3306 mysql:5.7.29   //定义相关信息
 [root@7-2 ~]# yum install mysql -y    //安装mysql软件
 [root@7-2 ~]# mysql -uroot -p123456 -h 127.0.0.1
 MySQL [(none)]> show databases;
 +--------------------+
 | Database           |
 +--------------------+
 | information_schema |
 | mysql              |
 | performance_schema |
 | sys                |
 | wordpress          |    //已创建好数据库
 +--------------------+
 ​
 ​

11.2 准备env 环境变量文件

 [root@7-2 data]# vim env.list
 MYSQL_ROOT_PASSWORD=123123
 MYSQL_DATABASE=wordpress
 MYSQL_USER=wpuser
 MYSQL_PASSWORD=wppass
 ​
 [root@7-2 data]# docker run -d -p 3307:3306 --env-file=env.list mysql:5.7.29
 ​
 [root@7-2 data]# mysql -uroot -p123123 -h 127.0.0.1 -P 3307    //真机登录的话,要指定3307端口,否则就会报错!!!
 ​
 [root@7-2 ~]# docker port cbb6be668a4b   //查看端口映射情况
 3306/tcp -> 0.0.0.0:3307
 3306/tcp -> [::]:3307