Jamal的博客

docker(2):基本操作


title: docker(2):基本操作
date: 2017-12-02 23:07:22
tags:

  • docker
    categories: docker

镜像操作

Docker Hub镜像操作

  • 搜索镜像
1
docker search centos
  • 从docker hub上下载镜像到本地
1
docker pull centos

本地镜像操作

  • 列出所有本地镜像
1
2
3
4
5
6
7
docker images
* 打tag
docker tag a653cd3f70bf Michael/test1

如果给镜像打tag前,镜像已经有tag,则打完tag,通过docker images可以查询出多条对应同一个镜像的记录。每一个tag对应一条记录。此时,需要要删除多余的tag,可以通过docker rmi进行删除

创建镜像

  • 基于本地旧的镜像创建新的镜像
    基于旧的镜像创建一个容器,在容器内安装新的软件包,然后将这个容器转换为一个新的本地镜像。转换的命令如下:
1
2
docker commit -m "Micheal test1" -a "Michael" 7222aa635c06 Michael/test1:V1
-m参数是说明,-a表示作者,后面是容器的标识,在本地仓库中的镜像名称

转换后,可以通过docker images查看到新创建的镜像,然后可以基于新镜像创建容器:

  • 基于Dockerfile创建镜像
    创建一个文件,文件名叫Dockerfile,内容如下:
1
2
3
4
5
# 一个在CentOS的基础上安装了vsftpd软件的镜像
FROM centos:latest
MAINTAINER Michael-Jiang jamal354172945@gmail.com
RUN yum install -y vsftpd

编译成本地仓库的一个镜像:

1
docker build -t Micheal/test1 .

容器操作

容器基本操作

  • 创建一个容器(不立即运行,处于停止状态)
1
docker create -it centos:latest
  • 创建并运行一个容器
1
docker run centos /bin/echo 'Hello world'
  1. 如果本地没有此镜像,会自动从远程Docker Hub中先下载镜像,再基于此镜像创建对应的容器。
  2. 后面的参数是指定容器启动后运行的命令。容器将在命令运行结束后停止。之后容器可以通过docker start container_name重新启动
  • 运行一个交互式的容器
1
docker run -t -i centos /bin/bash
  1. -t表示指定一个容器内的伪tty。-i表示创建一个交互式连接。
  2. 命令运行后,将会进入shell交互式界面,可执行任意的命令。
  • 启动一个后台运行的容器
    默认参数下,启动的容器将在前端运行。如果需要让容器在后台运行,则需要指定-d参数:
1
2
在后台运行一个CentOS容器,容器每1秒钟打印一句Hello World。
docker run -d centos /bin/sh -c "while true; do echo hello world; sleep 1; done"
  • 创建一个带名称的容器
1
docker run -d --name myweb centos /bin/bash
  • 开始/停止/强制停止一个的容器
1
docker start/stop/kill CONTAINER
  • 删除一个容器
1
docker rm CONTAINER

默认情况下只允许已经处于停止状态的容器。如果要删除处于停止状态的容器,需要加-f参数。

  • 查询容器的端口通过哪一个主机端口映射
1
docker port CONTAINER CONTAINER_PORT
  • 列出所有的容器
1
docker ps [-a][-l]
  1. 如果指定-a参数,则列出所有状态下的容器,包含处于stop状态的容器。如果没有带-a参数,则只显示出处于运行状态的容器。
  2. -l参数表示只列出最后一个启动的容器。
  • 查看容器的后台日志
1
docker logs [-f] CONTAINER

-f类似于Linux tail的-f参数。

  • 查看容器的进程
1
docker top CONTAINER
  • 查看容器的详细状态信息
1
2
docker inspect CONTAINER
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' CONTAINER

容器操作示例

  • 运行一个后台运行的Web容器(随机端口映射)
1
docker run -d -P training/webapp python app.py

-P参数表示根据容器的需求,映射主机的随机端口到容器内。

  • 运行一个后台运行的Web容器(指定端口映射)
1
docker run -d -p 6000:5000 training/webapp python app.py

-p参数表示主机的6000端口映射到容器的5000端口。

容器网络管理

基本使用

  • 查询所有网桥
    所有的容器默认挂在一个叫bridge的交换机(网桥)下,网桥可以通过如下命令查询:
1
docker network ls
  • 创建一个新的网桥
1
docker network create -d bridge my-bridge-network

示例

  • 创建一个叫web的容器,挂在默认网桥下:
1
docker run -d --name web training/webapp python app.py

可以看到该容器的IP地址是172.17网段IP:

1
2
docker exec -it web ifconfig
docker inspect --format='{{json .NetworkSettings.Networks}}' web | python -mjson.tool

再创建一个叫db的容器,挂在新创建的my-bridge-network网桥下

1
docker run -d --name db --network=my-bridge-network training/webapp python app.py

可以看到该容器的IP地址是172.18网段IP:

1
2
docker exec -it db ifconfig
docker inspect --format='{{json .NetworkSettings.Networks}}' db | python -mjson.tool

将web容器改为挂载到my-bridge-network下:

1
docker network connect my-bridge-network web

然后,再登录web容器,发现可以ping通db容器:

1
2
docker exec -it web bash
ping db

数据卷

  • 创建一个数据卷,数据存储在主机的随机目录下,数据随容器的删除而删除
    创建一个名叫web的容器,指定创建一个数据卷,数据卷挂载到容器内的/webapp目录下:
1
docker run -d -P --name web -v /webapp training/webapp python app.py

查看该容器的挂载信息

1
2
3
4
5
6
7
8
9
10
11
12
13
docker inspect web
"Mounts": [
{
"Name": "d09b1b111d62180bfb5677dfb1fc06567ec23819c655131c2755cdeea83c6832",
"Source": "/var/lib/docker/volumes/d09b1b111d62180bfb5677dfb1fc06567ec23819c655131c2755cdeea83c6832/_data",
"Destination": "/webapp",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],

可以看到该数据卷存储在主机的/var/lib/docker/volumes/目录下。

  • 创建一个数据卷,数据存储在主机的指定目录下,数据随容器的删除而删除
    同上,但手工指定主机的目录。如下将主机的/opt/test目录映射到容器内的/webapp目录:
1
docker run -d -P --name web -v /opt/test:/webapp training/webapp python app.py

备注:可以通过指定多个-v参数来映射多个数据卷。
也可以只映射指定的文件,而不是整个目录。将主机的/opt/test/hello文件映射到容器内的/webapp/file文件:

1
docker run -d -P --name web -v /opt/test/hello:/webapp/yes training/webapp python app.py

备注:通过vi等工具 修改挂载的文件可能会造成文件inode的改变,从而导致错误。因此,不推荐挂载文件的方式。

  • 以只读方式挂载
    在容器内的挂载目录后加上”:ro”即可:
1
docker run -d -P --name web -v /opt/test:/webapp:ro training/webapp python app.py