docker 容器的使用
一、启动容器有两种方式
1.基于镜像新建一个容器并启动
1.1 在后台运行一个docker
docker run -d centos /bin/sh -c "while true;do echo 正在运行;sleep 1;done"
# -d:后台运行
# /bin/sh 指定使用centos的bash
# -c运行一段shell命令
# "while true;do echo 正在运行;sleep 1;done" 在linux后台,每秒中打印一次正在运行
docker ps #检查容器进程
docker logs -f 容器id/名称 # 不间断打印容器的日志信息
docker stop 容器名称 # 停止容器
1.2 启动一个bash终端,允许用户进行交互
docker run --name mydocker -it centos /bin/bash
# --name 给容器定义一个名称
# -i : 让容器的标准输入保持打开
# -t: 让docker分配一个伪终端,并绑定到容器的标准输入上
# /bin/bash 指定docker容器,用shell解释器交互
当利用docker run 来创建容器时,docker在后台运行的步骤如下:
1).检查本地是否有指定的镜像,不存在就从共有仓库中下载
2).利用镜像创建并启动一个容器
3).分配一个文件系统,并在只读的镜像曾外面挂在一层可读可写
4).从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中
5).从地址池配置一个ip地址给容器
6).执行用户指定的应用程序
7).执行完毕后容器停止
1.2 将一个终止状态的容器重新启动
docker ps -a #查询记录
docker start 容器id #启动容器
docker exec -it 容器id /bin/bash #进入容器交互式界面
docker run == docker create + docker start
二、docker容器的其他命令
停止容器
docker stop CONTAINER_ID
杀死容器
docker kill container_name
查看容器列表
docker ps
docker ps –a
删除容器
docker rm
批量删除容器
docker rm -f `docker ps -a -q`
三、docker进入容器的方法
进入容器的目的:排错,调试
进入容器的方法:
1. docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
例子:
docker exec -it 容器id或容器名字 /bin/bash
2. docker attach [OPTIONS] CONTAINER
例子:
docker attach 容器id或容器名字
docker的本质是:在隔离的环境运行的一个进程。因此,docker容器内的第一个进程必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态!
四、docker容器的网络访问
1. 运行容器为什么要使用端口映射
默认,情况下,容器使用的ip是172.17.0.0/16网段的,外界的用户只能访问宿主机的10.0.0.0/24网段,无法访问172.17.0.0/16网段。我们运行容器的目的:是希望运行在容器中的服务,能够被外界访问,这里就涉及到了外网10.0.0.0/24到容器内网172.17.0.0/16网段的转换,所以需要做端口映射
2. docker运行容器端口映射的方法
a. 指定映射(docker 自动添加一条iptables规则实现端口映射)
-p hostPort:containerPort
-p ip:hostPort:containerPort
-p ip::containerPort(随机端口)
-p hostPort:containerPort:udp
-p 81:80 -p 443:443 可以指定多个-p
b. 随机映射
docker run -P (随机端口)
3. docker容器的网络原理
启动一个容器后,docker自动添加的iptable规则
如:docker run -it -p 1022:22 centos:6.8 /bin/bash
[root@769556f77150 /]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:656 (656.0 b) TX bytes:0 (0.0 b)
[root@web01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
769556f77150 centos:6.8 "/bin/bash" 2 minutes ago Up 2 minutes 0.0.0.0:1022->22/tcp interesting_blackwell
[root@web01 ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
MASQUERADE tcp -- 172.17.0.2 172.17.0.2 tcp dpt:22
Chain DOCKER (2 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:1022 to:172.17.0.2:22
五、运行一个web应用
用docker构建一个web应用程序
docker pull training/webapp #载入镜像
docker run -P training/webapp python app.py
# -P:将容器内部使用的网络端口映射到使用的主机上
查看web应用容器
多了端口信息,docker开放了5000端口(默认python Flask端口)映射到主机端口32679上
通过浏览器访问web应用
查看web应用程序中的app.py的内容
可以通过-p参数设置不一样的端口
docker run -d -p 5000:5000 training/webapp python app.py
docker ps 查看正在运行的容器,容器内部的5000端口映射到本地主机的5000端口上。
网络端口的快捷方式
通过docker ps 命令可以查看到容器的端口映射,还可以使用docker port命令查看指定容器的某个确定端口映射到宿主机的端口号。
docker port 容器id或者容器名称来查看容器端口映射情况
查看web应用程序容器的进程
docker top 命令查看容器内部运行的进程
检查web应用程序
使用docker inspect 来查看docker 的底层信息,会返回一个json文件记录着docker容器的配置和状态信息
停止web应用容器
docker stop 容器id或者容器名称
重启web应用程序
docker start 启动容器
dcoker ps -l 查询最后一次创建的容器
正在运行的容器,可以通过docker restart 容器id/容器name 重启
移除web应用容器
docker rm 命令删除不需要的容器
删除容器时,容器必须是停止状态,否则会报错