docker安装及常用命令
本文基于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
-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 <[email protected]>
RUN yum install -y vsftpd
编译成本地仓库的一个镜像:
docker build -t cheyo/myapp:v2 .
cheyo/myapp:v2
表示在本地库中的镜像标识。.
最后这个点表示Dockerfile的路径。
容器操作
容器基本操作
- 创建一个容器(不立即运行,处于停止状态)
docker create -it centos:latest
- 创建并运行一个容器
docker run centos /bin/echo 'Hello world'
- 如果本地没有此镜像,会自动从远程Docker Hub中先下载镜像,再基于此镜像创建对应的容器。
- 后面的参数是指定容器启动后运行的命令。容器将在命令运行结束后停止。之后容器可以通过
docker start container_name
重新启动。
- 运行一个交互式的容器
docker run -t -i centos /bin/bash
-t
表示指定一个容器内的伪tty。-i
表示创建一个交互式连接。- 命令运行后,将会进入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
- 默认情况下只允许已经处于停止状态的容器。如果要删除处于停止状态的容器,需要加
-f
参数。
- 查询容器的端口通过哪一个主机端口映射
docker port CONTAINER CONTAINER_PORT
- 列出所有的容器
docker ps [-a][-l]
- 如果指定
-a
参数,则列出所有状态下的容器,包含处于stop状态的容器。如果没有带-a
参数,则只显示出处于运行状态的容器。-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
上一篇: JAVA杂记