Docker安装与基本操作(CentOS7) 2016-08-04 22:50

说明

本文基于CentOS 7版本进行描述。CentOS对Docker支持较好的版本是CentOS 7。

本文docker-engine的版本是1.12。

安装

准备

# 更新系统软件包
yum update

# 安装docker的yum源
tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

执行安装

yum -y install docker-engine

服务启、停、查、重启

service docker start/stop/status/restart
chkconfig docker on

Hello,World

docker run hello-world

添加Docker Hub国内镜像

一般Docker Hub的镜像只能pull镜像下来,不是push镜像到hub上。

# 如果没有此文件,则新建一个
vi /etc/docker/daemon.json

{
    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

镜像操作

Docker Hub镜像操作

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

本地镜像操作

  • 列出所有本地镜像
docker images
  • 删除本地镜像
docker rmi centos

如果已经有基于此镜像的容器,需要先删除相应的容器再删除镜像。或者通过-f参数强制删除镜像,如docer rmi -f centos

  • 为镜像打tag
docker tag a653cd3f70bf cheyo/myapp:v2

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

创建镜像

  • 基于本地旧的镜像创建新的镜像

基于旧的镜像创建一个容器,在容器内安装新的软件包,然后将这个容器转换为一个新的本地镜像。转换的命令如下:

docker commit -m "cheyo test" -a "cheyo" 7222aa635c06 cheyo/myapp:v1
  1. -m参数是说明,-a表示作者,后面是容器的标识,在本地仓库中的镜像名称

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

docker images
docker run -t -i cheyo/myapp:v1 /bin/bash
  • 基于Dockerfile创建镜像

创建一个文件,文件名叫Dockerfile,内容如下:

# 一个在CentOS的基础上安装了vsftpd软件的镜像
FROM centos:latest
MAINTAINER cheyo Hou <abc@example.com>
RUN yum install -y vsftpd

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

docker build -t cheyo/myapp:v2 .
  1. cheyo/myapp:v2表示在本地库中的镜像标识。
  2. .最后这个点表示Dockerfile的路径。

容器操作

容器基本操作

  • 创建一个容器(不立即运行,处于停止状态)
docker create -it centos:latest
  • 创建并运行一个容器
docker run centos /bin/echo 'Hello world'
  1. 如果本地没有此镜像,会自动从远程Docker Hub中先下载镜像,再基于此镜像创建对应的容器。
  2. 后面的参数是指定容器启动后运行的命令。容器将在命令运行结束后停止。之后容器可以通过docker start container_name重新启动。
  • 运行一个交互式的容器
docker run -t -i centos /bin/bash
  1. -t表示指定一个容器内的伪tty。-i表示创建一个交互式连接。
  2. 命令运行后,将会进入shell交互式界面,可执行任意的命令。
  • 启动一个后台运行的容器

默认参数下,启动的容器将在前端运行。如果需要让容器在后台运行,则需要指定-d参数:

# 在后台运行一个CentOS容器,容器每1秒钟打印一句Hello World。
docker run -d centos /bin/sh -c "while true; do echo hello world; sleep 1; done"
  • 创建一个带名称的容器
docker run -d --name myweb centos /bin/bash
  • 开始/停止/强制停止一个的容器
docker start/stop/kill CONTAINER
  • 删除一个容器
docker rm CONTAINER
  1. 默认情况下只允许已经处于停止状态的容器。如果要删除处于停止状态的容器,需要加-f参数。
  • 查询容器的端口通过哪一个主机端口映射
docker port CONTAINER CONTAINER_PORT
  • 列出所有的容器
docker ps [-a][-l]
  1. 如果指定-a参数,则列出所有状态下的容器,包含处于stop状态的容器。如果没有带-a参数,则只显示出处于运行状态的容器。
  2. -l参数表示只列出最后一个启动的容器。
  • 查看容器的后台日志
docker logs [-f] CONTAINER

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

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

容器操作示例

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

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

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

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

容器网络管理

基本使用

  • 查询所有网桥

所有的容器默认挂在一个叫bridge的交换机(网桥)下,网桥可以通过如下命令查询:

docker network ls
  • 创建一个新的网桥
docker network create -d bridge my-bridge-network

示例

创建一个叫web的容器,挂在默认网桥下:

docker run -d --name web training/webapp python app.py

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

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

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

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

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

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

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

docker network connect my-bridge-network web

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

docker exec -it web bash
ping db

数据卷

  • 创建一个数据卷,数据存储在主机的随机目录下,数据随容器的删除而删除

创建一个名叫web的容器,指定创建一个数据卷,数据卷挂载到容器内的/webapp目录下:

docker run -d -P --name web -v /webapp training/webapp python app.py

查看该容器的挂载信息

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目录:

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

备注:可以通过指定多个-v参数来映射多个数据卷。

也可以只映射指定的文件,而不是整个目录。将主机的/opt/test/hello文件映射到容器内的/webapp/file文件:

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

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

  • 以只读方式挂载

在容器内的挂载目录后加上":ro"即可:

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

其他操作

  • 查询Docker的版本
docker version
  • 查询Docker的帮助
docker --help
docker rm --help

导入导出容器

  • 将容器导出成文件

不管理容器是否正在运行,都可以导出:

# web是容器名称
docker export web > web_docker.tar
docker export web -o web_docker.tar
  • 将文件导入恢复为镜像
cat web_docker.tar | docker import - cheyo/web1:1.0

参考文档

1.Docker Ducument

Tags: #Docker    Post on Docker