老李简单说Docker -- 容器管理

1、新建容器

复制代码
[root@localhost ~]# docker run centos /bin/echo "syavingc"
syavingc
交互式启动容器
[root@localhost ~]# docker run --name syavingc -it centos /bin/bash ##启动一个bash终端,允许用户进行交互。
[root@fe233ef7ae00 /]# pwd
/
[root@fe233ef7ae00 /]# ls
anaconda-post.log bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
--name:给容器定义一个名称
-i:则让容器的标准输入保持打开。
-t:让Docker分配一个伪终端,并绑定到容器的标准输入上
/bin/bash:执行一个命令
当利用docker run来创建容器时,Docker在后台运行的标准操作包括:
检查本地是否存在指定的镜像,不存在就从公有仓库下载
利用镜像创建并启动一个容器
分配一个文件系统,并在只读的镜像层外面挂在一层可读写层
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
从地址池配置一个ip地址给容器
执行用户指定的应用程序
执行完毕后容器被终止
[root@fe233ef7ae00 /]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 11756 1892 ? Ss 16:17 0:00 /bin/bash
root 17 0.0 0.0 47452 1672 ? R+ 16:19 0:00 ps aux
注意!
容器不是一个虚拟机,因为他就是一个进程,如果我们退出,这个进程就退出了。 
如果我们执行创建容器的时候,里面没有我们指定的镜像,那么他会从dockerhub上进行下载然后在启动
复制代码

2、启动容器

复制代码
启动容器:docker run –name -h hostname 
     docker run -d -P nginx 
-d运行在后台 
-P 代表随机映射 
nginx 镜像的名称
[root@localhost ~]# docker start fe233ef7ae00 ##容器启动
fe233ef7ae00
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fe233ef7ae00 centos "/bin/bash" 7 minutes ago Up 1 seconds syavingc
复制代码

3、停止容器

[root@localhost ~]# docker stop fe233ef7ae00 ##容器停止
fe233ef7ae00
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fe233ef7ae00 centos "/bin/bash" 7 minutes ago Exited (137) 1 seconds ago syavingc

4、进入容器

复制代码
####docker attach 
docker attach [容器ID或者名字] #进入容器 都是标准输入

[root@localhost ~]# docker attach fe233ef7ae00
[root@fe233ef7ae00 /]# pwd
/
[root@fe233ef7ae00 /]# hostname
fe233ef7ae00
##这样进入容器的缺点就是如果在开一个窗口就会同步操作,类似于单用户模式(windows远程桌面)
####docker nsenter
提示:生产场景是不使用docker attach的,需要我们使用nsenter这个工具,这个工具包含在util-linux软件包里面
[root@localhost ~]# yum install util-linux -y 
Centos7默认最小化已经安装
我们通过nsenter就可以进入容器,但是nsenter是通过pid进入容器里,所以我们需要知道容器的pid。我们可以通过docker inspect来获取到pid
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fe233ef7ae00 centos "/bin/bash" 16 minutes ago Exited (0) 52 seconds ago syavingc
0fd3287c3a0a centos "/bin/echo hahha" 18 minutes ago Exited (0) 18 minutes ago determined_roentgen
e068dff5ee86 hello-world "/hello" 54 minutes ago Exited (0) 54 minutes ago jolly_mccarthy
[root@localhost ~]# docker start fe233ef7ae00
fe233ef7ae00
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fe233ef7ae00 centos "/bin/bash" 16 minutes ago Up 1 seconds syavingc
0fd3287c3a0a centos "/bin/echo hahha" 19 minutes ago Exited (0) 19 minutes ago determined_roentgen
e068dff5ee86 hello-world "/hello" 54 minutes ago Exited (0) 54 minutes ago jolly_mccarthy
[root@localhost ~]# docker inspect -f "{{ .State.Pid }}" fe233ef7ae00
16178
[root@localhost ~]# nsenter -t 16178 -m -u -i -n -p
[root@fe233ef7ae00 /]# hostname
fe233ef7ae00
[root@fe233ef7ae00 /]#
docker inspect -f {{.State.Pid}}容器名或者容器id 
#每一个容器都有.State.Pid,所以这个命令除了容器的id需要我们根据docker ps -a去查找,其他的全部为固定的格式 
nsenter --target上面查到的进程id --mount --uts --ipc --net --pid #输入该命令便进入到容器中
解释nsenter指令中进程id之后的参数的含义:
* –mount参数是进去到mount namespace中 
* –uts参数是进入到uts namespace中 
* –ipc参数是进入到System V IPC namaspace中 
* –net参数是进入到network namespace中 
* –pid参数是进入到pid namespace中 
* –user参数是进入到user namespace中
以下是以nsenter启动的进程
[root@fe233ef7ae00 /]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 11780 1684 ? Ss+ 16:34 0:00 /bin/bash
root 14 0.0 0.1 15212 2000 ? S 16:34 0:00 -bash
root 28 0.0 0.0 50884 1804 ? R+ 16:36 0:00 ps aux

/bin/bash是我们运行容器产生的进程 
-bash 是我们使用nsenter产生的,这样如果我们退出容器,容器就不会退出,因为-bash还在运行
[root@fe233ef7ae00 /]# exit
logout
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fe233ef7ae00 centos "/bin/bash" 20 minutes ago Up 3 minutes syavingc
因为每次进入容器都需要输入那两条命令,所以我们可以写一个脚本来获取。 
脚本内容如下:
[root@localhost ~]# cat 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
}
docker_in $1

[root@localhost ~]# cat docker_in.sh 
#!/bin/bash
# Use nsenter to access docker
PID=$(docker inspect -f "{{ .State.Pid }}" $1)
nsenter -t $PID -m -u -i -n -p
1.5.3 docker exec
我们也可以不进入容器进行查看
[root@localhost ~]# docker exec syavingc ps -ef 
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 16:34 ? 00:00:00 /bin/bash
root 44 0 0 16:42 ? 00:00:00 ps -ef
提示:可以使用exec参数,不进入容器查看内容
我们还可以使用exec进入docker容器中
[root@localhost ~]# docker exec -it syavingc /bin/bash
[root@fe233ef7ae00 /]# hostname
fe233ef7ae00
但是最好还是少使用exec,有可能会对容器造成一些意外的影响
使用docker attach命令
我们使用
docker attach db3 或者 docker attach d48b21a7e439
db3是后台容器的NAMES,d48b21a7e439是容器的进程ID CONTAINER ID
然后就进去了这个容器的ssh界面。
但是它有一个缺点,只要这个连接终止,或者使用了exit命令,容器就会退出后台运行
使用docker exec命令
这个命令使用exit命令后,不会退出后台,一般使用这个命令,使用方法如下
docker exec -it db3 /bin/sh 或者 docker exec -it d48b21a7e439 /bin/sh
db3是后台容器的NAMES,d48b21a7e439是容器的进程ID CONTAINER ID
/bin/sh 是固定写法
它也能进入这个容器
不进入容器进行查看容器内部信息、当前bash显示
docker exec web-server ls
进入容器,标准显示
root@linux-node3:~# docker exec -it web-server ls
bin dev home lib64    media opt root    selinux sys usr
boot etc lib    lost+found mnt proc sbin    srv    tmp var
对于容器指定bash环境
root@linux-node3:~# docker exec -it web-server /bin/bash
[root@68a67bc5b71a /]# ls
bin dev home lib64 media opt root selinux sys usr
boot etc lib lost+found mnt proc sbin srv tmp var
复制代码

5、容器重命名

docker rename web01 web-server   ##把容器web01 重命名为web-server

6、删除容器

复制代码
######单个容器删除
[root@localhost ~]# docker rm cd5c192a27f1 ##注意,容器必须停止后才能删除
cd5c192a27f1
######删除所有容器(只有先停止才可以删除)
[root@linux-node1 ~]# docker rm $(docker ps -a -q)
30c74a556850
b2bef96c8330
######杀死所有正在运行的容器:
[root@linux-node1 ~]# docker kill $(docker ps -a -q)
1a29a9cdffdf
30c74a556850
[root@linux-node1 ~]# docker ps -a -q
6406f7d6f714
3eb6fd92b24a
ada87f9c6e1f
6ac87e3b5110
db876338c52b
7004feaeb253
5e1963a3eab4
338d6c2e8dcb
[root@linux-node1 ~]# docker kill $(docker ps -a -q)
6406f7d6f714
3eb6fd92b24a
ada87f9c6e1f
6ac87e3b5110
db876338c52b
5e1963a3eab4
Failed to kill container (7004feaeb253): Error response from daemon: Cannot kill container 7004feaeb253: Container 7004feaeb253092ec25824d72ddda87472b47db143b54c76dbc3f6daf10b5229 is not running
Failed to kill container (338d6c2e8dcb): Error response from daemon: Cannot kill container 338d6c2e8dcb: Container 338d6c2e8dcb526b1deee2c7bdeb544d9885452f537dab79a8f80d04432fd17b is not running
[root@linux-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
复制代码

7、查看运行的容器

docker ps #查看已经运行的容器
docker ps -a #查看所有容器(运行的和不运行的)
docker ps -l #查看最新创建的容器
docker ps -q #只显示所有容器的PID
docker ps -s #显示所有容器的大小

8、查看容器的信息

########查看容器信息docker inspect
docker inspect web-server #显示信息很多。。。

9、查看容器中运行的进程

#########容器中运行的进程
docker top web-server

10、查看容器的端口映射信息

#####映射端口的信息
root@linux-node3:~# docker port influxdb
8086/tcp -> 0.0.0.0:8086
8083/tcp -> 0.0.0.0:8083

11、复制文件到容器

复制代码
###把宿主机的文件复制到容器内
root@linux-node3:~# docker cp test.txt web-server:/home/
root@linux-node3:~# docker exec -it web-server ls /home/
test.txt
###把容器的文件复制到本地宿主机
root@linux-node3:~# docker cp web-server:/home/test.txt /opt/
root@linux-node3:~# ls /opt/
test.txt
复制代码

12、看日志

复制代码
[root@localhost containers]# pwd
/var/lib/docker/containers
[root@localhost containers]# ll
total 0
drwx------ 4 root root 149 Dec 4 13:52 aa16f816e2217d189c27189ac407b404dd6bbd2a978dd1480fc3db8ab046e723
drwx------ 4 root root 149 Dec 4 13:44 e1083576d2d16401bfeda2a92d89333f6b9c9ea9ab710a5f2b4959b539f7f405
[root@localhost containers]#

[root@localhost ~]# docker run -d -p 80:80 --name web nginx
879aee833d293856dbe6c35947fca84afe214096fa34975723dd90003b551213
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
879aee833d29 nginx "nginx -g 'daemon off" 5 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp web
fe233ef7ae00 centos "/bin/bash" 52 minutes ago Up 35 minutes syavingc
[root@localhost ~]# docker logs 879aee833d29
10.0.0.1 - - [24/Oct/2017:17:10:30 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" "-"
10.0.0.1 - - [24/Oct/2017:17:10:30 +0000] "GET /favicon.ico HTTP/1.1" 404 571 "http://10.0.0.30/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" "-"
2017/10/24 17:10:30 [error] 7#7: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.0.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "10.0.0.30", referrer: "http://10.0.0.30/"
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值