欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

docker安装及常用命令

程序员文章站 2024-03-13 15:29:39
...

本文基于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 <[email protected]>
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

上一篇: JAVA杂记

下一篇: