04 Docker 容器管理


启动容器 docker run

  1. docker 的容器是镜像的一个运行实例。
  2. docker 镜像是只读文件,而容器则带有运行时的可读写层,而且容器中的应用进程处于运行状态。
  • docker run :创建一个新的容器并运行一个命令
1
2
3
4
5
6
7
8
9
10
11
12
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

-t :打开一个终端,像使用交换机一样使用容器
-i:交互式访问
--name:容器名字
--network:指定网络
--rm:容器一停,自动删除
-d:剥离与当前终端的关系;否则会一直占据着终端
-p:端口映射,将容器内服务的端口映射在宿主机的指定端口
-p <container port>
-p <hostport>:<container port>
-p <hostip>:<hostport>:<container port>
1
2
3
4
5
6
7
8
9
10
11
12
# 如果不执行命令,那么容器使用的镜像名 在最后
# 如果docker run 本地没有镜像,那么他会帮你pull下来

1. 下载 centos:7镜像
[root@linux-node1 ~]# docker pull centos:7

2. 运行centos:7 镜像
[root@linux-node1 ~]# docker run -it --rm --name mycentos centos:7 /bin/bash
[root@593621d0b6cc /]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@593621d0b6cc /]# uname -r
3.10.0-327.el7.x86_64

查看运行的容器 docker ps

1
2
3
[root@linux-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9ba7d5f9d22 centos:7 "/bin/bash" 8 seconds ago Up 7 seconds mycentos

显示所有 -a

1
2
3
4
5
6
7
8
9
# 现在执行exit 就退出bash  容器也跟着退出了,因为进程结束了,容器也结束了

[root@linux-node1 ~]# docker run -it --name mycentos centos:7 /bin/bash
[root@0dc9c214c2c9 /]# exit
exit

[root@linux-node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0dc9c214c2c9 centos:7 "/bin/bash" 5 seconds ago Exited (0) 2 seconds ago mycentos

显示ID -q

1
2
[root@linux-node1 ~]# docker ps -aq
0dc9c214c2c9

启动容器 docker start

1
2
3
4
5
6
7
8
9
10
[root@linux-node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0dc9c214c2c9 centos:7 "/bin/bash" 5 seconds ago Exited (0) 2 seconds ago mycentos

[root@linux-node1 ~]# docker start mycentos
mycentos

[root@linux-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0dc9c214c2c9 centos:7 "/bin/bash" 11 minutes ago Up 2 seconds mycentos

查看容器的详细信息 docker inspect

1
2
3
4
5
6
7
# 查看所有
[root@linux-node1 ~]# docker inspect mycentos
[root@linux-node1 ~]# docker inspect mycentos|grep IPAddress

# 查看容器的pid 可以用于nsenter进入容器
[root@linux-node1 ~]# docker inspect -f "{{ .State.Pid }}" 0dc9c214c2c9
2525

查看容器运行情况 docker top

1
2
3
[root@linux-node1 ~]# docker top 0dc9c214c2c9
UID PID PPID C STIME TTY TIME CMD
root 2525 2508 0 10:30 pts/0 00:00:00 /bin/bas

停止容器 docker stop

1
2
3
4
5
6
7
8
9
10
[root@linux-node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0dc9c214c2c9 centos:7 "/bin/bash" 27 minutes ago Up 16 minutes mycentos

[root@linux-node1 ~]# docker stop mycento
mycentos

[root@linux-node1 ~]# docker ps -a
CONTAINER ID IMGE COMMAND CREATED STATUS PORTS NAMES
0dc9c214c2c9 centos:7 "/bin/bash" 27 minutes ago Exited (137) 4 seconds ago mycento

删除容器 docker rm

先关闭容器,再删除容器
1
2
3
[root@linux-node1 ~]# docker stop mycentos
[root@linux-node1 ~]# docker rm mycentos
[root@linux-node1 ~]# docker ps -a
1
2
# 强制删除容器
[root@linux-node1 ~]# docker rm -f mycentos

批量删除容器

生产环境谨慎使用
1
2
3
4
5
# 只删除关闭状态的
[root@linux-node1 ~]# docker rm $(docker ps -qa)

# #强制删除全部,包括启动中的
[root@linux-node1 ~]# docker rm -f $(docker ps -aq)

进入容器

  • 进入容器的三种方法:attach(不推荐)、exec、
1
2
3
* 和虚拟机不同 你不能进去 再执行新的东西,因为docker的理念和虚拟机不同
* docker的理念是 再创建一个容器 也不能修改一个容器
* 不可变基础环境 --> 环境必须一致

attach

  1. 进入到存活的容器中
  2. 如果再开一个窗口进来,操作是同步的,就像远程控制,单用户模式
  3. exit 就会推出, 生产不会使用这个命令
1
2
3
4
[root@linux-node1 ~]# docker start mycentos
mycentos
[root@linux-node1 ~]# docker attach mycentos
[root@45fce97e86cc /]#

exec

  1. 对运行的容器执行指定命令
  2. 不想进入,让容器执行命令并返回结果
1
2
3
4
5
6
7
 -d:在后台运行命令
-e:设置环境变量
-i:交互式
-t:打开一个终端
-u:用户名或UID
暂时退出容器:ctrl+p,ctrl+q
回到容器:docker attach id或name
1
2
3
4
[root@linux-node1 ~]# docker exec mycentos ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.0 11824 1700 pts/0 Ss+ 03:02 0:00 /bin/bash
root 14 0.0 0.0 51744 1724 ? Rs 03:02 0:00 ps -aux

退出并不停止 docker

  1. crtl 先p 再q
1
2
3
4
5
6
7
# 交互式进入容器 -it
[root@linux-node1 ~]# docker exec -it mycentos /bin/bash
# 如果不想退出 就结束容器
>>> crtl 先p 再q
[root@linux-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
45fce97e86cc centos:7 "/bin/bash" 6 minutes ago Up 3 minutes mycentos

nsenter

  1. nsenter 生产使用
  2. 即使exit 也不会关闭容器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
1. 安装
[root@linux-node1 ~]# yum install -y util-linux
- nsenter : ns (namespace) 进入到命名空间
- docker 的实现 : Docker利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心命名空间(namespaces)
- 需要容器进程的pid

2. 获取容器的PID,容器需要是启动状态,否则获取为0
[root@linux-node1 ~]# docker inspect -f "{{ .State.Pid }}" mycentos
3665

3. nsenter 进入
[root@linux-node1 ~]# nsenter -t 3665 -m -u -i -n -p /bin/bash
[root@45fce97e86cc /]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 11824 1700 pts/0 Ss+ 03:02 0:00 /bin/bash
root 24 0.0 0.0 11824 1696 pts/1 Ss+ 03:04 0:00 /bin/bash
root 118 0.0 0.0 15256 2020 pts/0 S 03:20 0:00 /bin/bash
root 127 0.0 0.0 55176 1872 pts/0 R+ 03:20 0:00 ps -aux

4. 进入容器脚本
[root@linux-node1 ~]# vim docker_in.sh

#!/bin/bash
# Use nsenter to access docker

docker_in(){
NAME_ID=$1
PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID)
nsenter -t $PID -m -u -i -n -p /bin/bash
echo $PID
}

docker_in $1

5. 脚本权限并执行
[root@linux-node1 ~]# chmod +x docker_in.sh
[root@linux-node1 ~]# ./docker_in.sh mycentos
[root@45fce97e86cc /]#

查看日志 docker logs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1. 启动一个nginx:1.4的容器
# 根据镜像名称(tag指定版本)拉取镜像
# alpine版本:构建容器小镜像的发型版本
[root@linux-node1 ~]# docker pull nginx:1.14-alpine

2. 启动nginx容器
[root@linux-node1 ~]# docker run --name web1 -d -p 80:80 nginx:1.14-alpine
16ced725c5f998f7a59b98731ba74305f2e3adc96449410ecfef20b8c5174944

3. 浏览器访问
访问 http://10.0.0.100

4. curl访问
[root@linux-node1 ~]# docker logs web1

5. 查看日志
[root@linux-node1 ~]# docker logs web1

copy容器文件 docker cp

  • 该命令支持在容器和主机之间复制文件。
1
2
-a, -archive: 打包模式, 复制⽂件会带有原始的uid/gid信息;
-L, -follow-link: 跟随软连接。 当原路径为软连接时, 默认只复制链接信息, 使⽤该选项会复制链接的⽬标内容。
1
2
3
4
5
6
# 服务器向容器copy文件
[root@linux-node1 ~]# docker cp /root/docker_in.sh mycentos:/tmp
[root@linux-node1 ~]# ./docker_in.sh mycentos
[root@45fce97e86cc /]# cd /tmp/
[root@45fce97e86cc tmp]# ls
docker_in.sh ks-script-rnBCJB yum.log
1
2
3
4
5
6
7
8
9
# copy容器的文件下来
[root@linux-node1 ~]# docker cp web1:/etc/nginx/nginx.conf .

[root@linux-node1 ~]# ls -l
total 126796
-rw-------. 1 root root 1239 Sep 30 17:27 anaconda-ks.cfg
-rwxr-xr-x. 1 root root 196 Oct 9 14:01 docker_in.sh
-rw-------. 1 root root 129824768 Oct 10 08:34 nginx:1.16.tar
-rw-rw-r--. 1 root root 643 Apr 10 2019 nginx.co

查看端口映射 docker port

1
2
[root@linux-node1 ~]# docker port web1
80/tcp -> 0.0.0.0:80

容器的导入和导出

导出容器

1
2
3
4
# 导出后的容器就可以直接复制到其他机器上导入运行了
[root@linux-node1 ~]# docker export -o web1.tar web1
[root@linux-node1 ~]# ls -lh web1.tar
-rw-------. 1 root root 17M Oct 10 11:46 web1.tar

导入容器

1
2
3
4
5
6
7
[root@linux-node1 ~]# docker import web1.tar test/nginx:1.6.test
sha256:482793b910f56b65c0dbb36c4424cca923765ecd3d052c30a0db70c185bd6571

[root@linux-node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
16ced725c5f9 nginx:1.14-alpine "nginx -g 'daemon of…" 15 minutes ago Up 15 minutes 0.0.0.0:80->80/tcp web1
45fce97e86cc centos:7 "/bin/bash" 47 minutes ago Up 45 minutes mycentos

总结容器的使用操作

  1. docker run 参数 镜像名 执行命令
  2. 进入容器的三种方
  3. 一图总结对容器的操作命令: