Docker入门
Posted shi_zi_183
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker入门相关的知识,希望对你有一定的参考价值。
Docker入门
Docker是一个开源的容器引擎,它有助于更快地交付应用。Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理。使用Docker,可更快地打包、测试以及部署应用程序,并可缩短从编写到部署运行代码地周期。
版本与迭代计划
版本区别
Docker EE(企业版)
Docker EE由公司提供支持,可在经过认证的操作系统和云提供商中使用,并可运行来自Docker Store的、经过认证的容器和插件。
Docker EE提供了三个服务层次
服务层次 | 功能 |
---|---|
Basic | 包含用于认证基础设施的Docker平台Docker公司的支持 |
Standard | 高级镜像与容器管理LDAP/AD用户集成基于角色的访问控制(Docker Datacenter) |
Advanced | Docker安全扫描连续漏洞监控 |
Docker CE
Docker CE是免费的Docker产品的名称,Docker CE包含了完整的Docker平台,非常适合开发人员和运维团队构建容器APP
迭代计划
Docker从17.03开始,转向基于时间的YY、MM形式的版本控制方案,类似Canonical公司为Ubuntu所定之的版本控制方案。
Docker CE有两种版本
- edge:edge版本每月发布一次,主要面向喜欢尝试新功能的用户。
- stable(稳定版):stable版本每季度发布一次,适用于生产。
edge版本只在发布的当前月获得安全和错误修复,而stable版本可在发布后4个月内接收关键错误修复和安全问题的修补程序。
这样,Docker CE用户就有一个月的窗口期来切换到更新的版本。Docker CE17.03会维护到2017年的7月;而Docker CE 17.03的下一个稳定版本是CE17.06,这样,在6月到7月这个时间窗口,用户就可以升级。
Docker EE和stable版本的版本号保持一致,每个Docker EE版本都享受为期一年的支持与维护期,在此期间接收安全与关键修正。
Docker的架构
- Docker daemon(Docker守护进程):Docker daemon是一个运行在宿主机(DOCKER_HOST)的后台进程。可通过Docker客户端与之通信。
- Client(Docker客户端):Docker客户端是Docker的用户界面,它可以接收用户命令和配置标识,并与Docker daemon通信。
- Image(Docker镜像):Docker镜像是一个只读模板,它包含创建Docker容器的说明。它和系统安装光盘有点像——使用系统安装光盘可以安装系统,同理,使用Docker镜像可以运行Docker镜像中的程序。
- Container(容器):容器是镜像的可运行示例。镜像和容器的关系有点类似于面向对象中,类与对象的关系。可通过Docker API或者CLI命令来启停、移动、删除容器。
- Registry(注册中心):Docker Registry是一个几种存储与分发镜像的服务。构建完Docker镜像后,就可在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,就需要手动复制。此时可借助Docker Registry来避免镜像的手动复制。
需要注意,一个Docker Registry可包含多个Docker仓库,每个仓库可包含多个镜像标签,每个标签对应一个Docker镜像。这跟Maven的仓库有点类似,如果把Docker Registry比作Maven仓库的话,那么Docker仓库就可理解为某jar包的路径,而镜像标签则可理解为jar包的版本号。
Docker Registry可分为公有Docker Registry和私有Docker Regustry。最常用的Docker Registry莫过于官方的Docker Hub,这也是默认的Docker Registry。Docker Hub上存放着大量优秀的镜像,可使用Docker命令下载并使用。
安装Docker
CentOS 7安装Docker
使用Yum安装
卸载老版本的Docker
在CentOS中,老版本Docker的软件包名是docker或docker-engine,而Docker CE的软件包名称是docker-ce。因此,若已安装过老版本的Docker,需使用如下命令卸载
sudo yum remove docker docker-common docker-selinx docker-engine
需要注意的是,执行该命令只会卸载Docker本身,不会删除Docker存储的文件,例如镜像、容器、卷以及网络文件等。这些文件保存在/var/lib/docker
目录中,需要手动删除。
安装仓库
1)执行以下命令,安装Docker所需的包。其中,yum-utils提供了yum-config-manager工具;device-mapper-persistent-data及lvm2则是devicemapper存储驱动所需的包。
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
执行如下命令,安装stable仓库。必须按照stable仓库,即使你想按照edge或test仓库中的Docker构建版本。
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3)执行如下命令,启动edge及test仓库。edge/test仓库其实也包含在了docker.repo文件中,但默认是禁用的,可使用以下命令启用。
sudo yum-config-manager --enable docker-ce-edge #启用edge仓库
sudo yum-config-manager --enable docker-ce-test #启用test仓库
若需再次禁用,可加上–disable标签。例如,执行如下命令即可禁用edge仓库。
sudo yum-config-manager --disable docker-ce-edge
安装Docker CE
1)执行以下命令,更新yum的包索引
sudo yum makecashe fast
2)执行如下命令即可安装最新版本的Docker CE
sudo yum install docker-ce
3)在生产环境中,可能需要指定想要版本安装,此时可使用如下命令列出当前可用的Docker版本
yum list docker-ce.x86_64 --showduplicates | sort -r
列出版本后,可使用如下命令安装想要安装的Docker CE版本。
sudo yum install docker-ce-<VERSION>
4)启动Docker
sudo systemctl start docker
5)验证安装是否正确
sudo docker run hello-world
配置镜像加速器
国内访问Docker Hub的速度很不稳定,有时甚至出现连接不上的情况。本节来为Docker配置镜像加速器,从而解决这个问题。目前国内很多云服务商都提供了镜像加速的服务。
常用的镜像加速器有阿里云加速器、DaoCloud加速器等。各厂商镜像加速器的使用方式大致类似,本节以阿里云加速器为例进行讲解。
1)注册阿里云账号后,即可在阿里云控制台(http://cr.console.aliyun.com/#/accelerator)看到
2)执行脚本
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://anwtopv6.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker常用命令
Docker有很多命令,这些命令有助于控制Docker的行为。
Docker镜像常用命令
搜索镜像
可使用docker search命令搜索存放在Docker Hub中的镜像。
命令格式:
docker search [OPITONS] TERM
docker search命令参数
Name,shorthand | Default | Desctiption |
---|---|---|
–automated | false | [已废弃]只列出自动构建的镜像 |
–filter,-f | 根据指定条件过滤结果 | |
–limit | 25 | 搜索结果的最大条数 |
–no-trunc | false | 不截断输出,显示完整的输出 |
–stars,-s | 0 | [已废弃]只展示Star不低于该数值的结果 |
docker search java
执行该命令后,会在Docker Hub中搜索含有java这个关键词的镜像仓库。执行该命令后,可看到类似如下的表格:
该表格包含5列,含义如下:
- NAME:镜像仓库名称。
- DESCRIPTION:镜像仓库描述
- STARS:镜像仓库收藏数,表示该镜像仓库的受欢迎程度,类似于GitHub的Stars。
- OFFICAL:表示是否为官方仓库,该列标记为[OK]的镜像均由各软件的官方项目组创建和维护。由结果可知,java这个镜像仓库是官方仓库,而其他仓库都不是官方镜像仓库。
- AUTOMATED:表示是否自动构建的镜像仓库。
下载镜像
使用命令docker pull命令即可从Docker Registry上下载镜像。
命令格式
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Name,shorthand | Default | Description |
---|---|---|
–all-tags,-a | false | 下载所有标签的镜像 |
–disable-content-trust | true | 忽略镜像的校验 |
docker pull java
执行该命令后,Docker会从Docker Hub中的java仓库下载最新版本的Java镜像。若镜像下载缓慢,可配置镜像加速器。
该命令还可指定想要下载的镜像标签以及Docker Registry地址
docker pull reg.itmuch.com/java:7
这样就可从指定Docker Registry中下载标签为7的Java镜像。
列出镜像
使用docker images命令即可列出已下载的镜像。
命令格式:
docker images [OPTIONS] [REPOSITORY[:TAG]]
Name,shorthand | Default | Description |
---|---|---|
–all,-a | false | 列出本地所有的镜像(包括中间镜像层,默认情况下,过滤中间映像层) |
–digests | false | 显示摘要信息 |
–filter,-f | 显示满足条件的镜像 | |
–format | 通过Go语言模板文件展示镜像 | |
–no-trunc | false | 不截断输出,显示完整的镜像信息 |
–quiet,-q | false | 只显示镜像ID |
docker images
docker images java
docker images java:8
docker images --digests
docker images --filter "dangling=true" #展示虚悬镜像
该列表包含了5列,含义如下:
- REPOSITORY:镜像所属仓库名称
- TAG:镜像标签。默认是latest,表示最新
- IMAGE ID:镜像ID,表示镜像唯一标识
- CREATED:镜像创建时间
- SIZE:镜像大小
删除本地镜像
使用docker rmi命令即可删除指定镜像。
命令格式:
docker rmi [OPTIONS] IMAGE [IMAGE...]
Name,shorthand | Default | Description |
---|---|---|
–force,-f | false | 强制删除 |
–no-prune | false | 不移除该镜像的过程镜像,默认移除 |
删除指定名称的镜像
docker rmi hello-world
删除所有镜像
docker rmi -f $(docker images -qa)
保存镜像
使用docker save即可保存镜像
docker save [OPTIONS] IMAGE [IMAGE...]
Name,shorthand | Default | Description |
---|---|---|
–output,-o | 输出到文件,而非标准输出 |
docker save hello-world > hello-world.tar
docker save --output hello-world.tar hello-world
保存镜像
使用docker save即可保存镜像
docker save [OPTIONS] IMAGE [IMAGE...]
Name,shorthand | Default | Description |
---|---|---|
–input,-i | 从文件加载而非标准输入 | |
–quiet,-q | false | 静默加载 |
docker load < helloworld.tar
docker load --input helloworld.tar
构建镜像
通过Dockerfile构建镜像
docker build [OPTIONS] PATH | URL | -
Name,shorthand | Default | Description |
---|---|---|
–add-host | 添加自定义从host到IP的映射,格式为(host:ip) | |
–build-arg | 设置构建时的变量 | |
–cache-from | 作为缓存源的镜像 | |
–cgroup-parent | 从容器指定可选的父cgroup | |
–compress | false | 使用gzip压缩构建上下文 |
–cpu-period | 0 | 限制CPU CFS(Completely Fair Scheduler)周期 |
–cpu-quota | 0 | 限制CPU CFS(Completely Fair Scheduler)周期 |
–cpu-shares,-c | 0 | CPU使用权重(相对权重) |
–cpuset-cpus | 指定允许执行的CPU(-0.3,0,1) | |
–cpuset-mems | 指定允许执行的内存(-0.3,0,1) | |
–disable-content-trust | true | 忽略校验 |
–file,-f | 指定Dockerfile的名称,默认是PATH/Dockerfile | |
–force-rm | false | 删除中间容器 |
–iidfile | 将镜像ID写到文件中 | |
–isolation | 指定容器隔离技术 | |
–label | 为镜像设置元数据 | |
–memory,-m | 0 | 设置内存限制 |
–memory-swap | 0 | 设置swap的最大值为内存+swap,如果设置为-1表示不限swap |
–network | default | 在构建期间设置RUN指令的网络模式 |
–no-cache | false | 构建镜像过程中不使用缓存 |
–pull | false | 总是尝试去下载更新版本的镜像 |
–quiet,-q | false | 静默模式,构建成功后只输出镜像ID |
–rm | true | 构建成功后立即删除中间容器 |
–security-opt | 安全选项 | |
–shm-size | 0 | 指定/dev/shm目录大小 |
–squash | false | [实验]将构建的层压缩成一个新的层 |
–stream | [实验]连接到服务器的流,用于协商构建上下文 | |
–tag,-t | 设置标签,格式为name:tag,其中tag可选 | |
-target | 设置构建时的目标构建阶段 | |
–ulimit | Ulimit选项 |
docker build -t itmuch/some-repo:some-tag .
Docker容器常用命令
新建并启动容器
使用docker run命令即可新建并启动一个容器。
Name,shorthand | Default | Description |
---|---|---|
–detach,-d | 后台运行容器,并打印容器ID | |
–publish-all,-p | 随机映射所有端口 | |
–publish,-p | 指定端口映射,该选项有以下四种格式: | |
ip:hostPort:containerPort | ||
ip::containerPort | ||
hostPort:containerPort | ||
containerPort | ||
–network | 指定网络模式,该选项有以下四种可选参数 | |
–network=bridge:默认选项,表示连接到默认的网桥。 | ||
–network=host:容器使用宿主机的网络。 | ||
–network=container:NAME_or_ID:告诉Docker让新建的容器使用已有容器的网络配置 | ||
–network=none:不配置该容器的网络,用户可自定义网络配置 |
docker run java /bin/echo 'Hello World'
这样终端会打印Hello World的字样,跟在本地直接执行/bin/echo 'Hello World’一样。
docker run -d -p 91:80 nginx
这样就可启动一个Nginx容器。访问http://Docker宿主机IP:91/
列出容器
使用docker ps命令即可列出运行中的容器。
docker ps [OPTIONS]
Name,shorthand | Default | Description |
---|---|---|
–all,-a | false | 列出所有容器、包括未运行的容器。默认只展示运行的容器 |
–filter,-f | 根据条件过来显示内容 | |
–format | 通过GO语言模板文件展示镜像 | |
–last,-n | -1 | 显示最近创建的n个容器(包含所有状态) |
–latest,-l | false | 显示最近创建的容器(包含所有状态) |
–no-trunc | false | 不截断输出 |
–quiet,-q | false | 静默模式,只展示容器的ID |
-size,-s | false | 显示总文件大小 |
docker ps
- CONTAINER_ID:表示容器ID
- IMAGE:表示镜像名称
- COMMAND:表示启动容器时运行的命令
- CREATED:表示容器的创建时间
- STATUS:表示容器运行的状态。Up表示运行中,Exited表示已停止
- PORTS:表示容器对外的端口号
- NAMES:表示容器名称。该名称默认由Docker自动生成,也可使用docker run命令的-name选项自行指定。
停止容器
使用docker stop 命令即可容器。
docker stop [OPTIONS] CONAINER [CONTAINER...]
Name,shorthand | Default | Description |
---|---|---|
–time,-t | 10 | 强制停止容器前等待的时间,单位是s |
docker stop d8518c386c16
强制停止容器
可使用docker kill命令发送SIGKILL信号来强制停止容器。
docker kill [OPTIONS] CONTATINER [CONTAINER...]
Name,shorthand | Default | Description |
---|---|---|
–signal,-s | KILL | 向容器发送一个信号 |
docker kill d8518c386c16
启动已停止的容器
使用docker run命令即可新建并启动一个容器。对于已停止的容器,可使用docker start命令来启动。
docker start [OPTIONS] CONTAINER [CONTAINER...]
Name,shorthand | Default | Description |
---|---|---|
–attach,-a | false | 连接STDOUT/STDERR并转发信号 |
–checkpoint | [实验]从该检查点还原 | |
–checkpoint-dir | [实验]使用自定义的检查点存储目录 | |
–detach-keys | 覆盖断开容器的关键顺序 | |
–interactive,-i | false | 连接容器的STDIN |
docker start d8518c386c16
重启容器
可使用docker restart命令来重启容器。该命令实际上是先执行了docker stop命令,然后执行了docker start命令。
docker restart d8518c386c16
Name,shorthand | Default | Description |
---|---|---|
–time,-t | 10 | 关闭容器前等待的时间,单位是s |
进入容器
- 使用docker attach命令进入容器。
docker attach d8518c386c16
在很多场景下,使用docker attach命令并不方便。当多个窗口同时attach到同一个容器时,所有窗口都会同步显示。同理,如果某个窗口发生阻塞,其他窗口也无法执行操作。
- 使用nsenter进入容器。
nsenter工具包含在util-linux2.23或更高版本中。为了连接到容器,需要找到容器一个进程的PID,可通过以下命令获取:
docker inspect --format "{{.State.Pid}}" $CONTAINER_ID
获得PID后,就可使用nsenter命令进入容器了:
nsenter --target "$PID" --mount --uts --ipc --net --pid
docker ps
docker inspect -f "{{.State.Pid}}" d8518c386c16
nsenter --target 14745 --mount --uts --ipc --net --pid /bin/bash
删除容器
使用docker rm命令即可删除指定容器。
docker rm [OPTIONS] CONTAINER [CONTAINER...]
Name,shorthand | Default | Description |
---|---|---|
–force,-f | false | 通过SIGKILL信号强制删除正在运行中的容器 |
–link,-l | false | 删除容器间的网络连接 |
–volumes,-v | false | 删除与容器关联的卷 |
删除指定容器
docker rm
该命令只能删除已停止的容器,如需删除正在运行的容器,可使用-f参数
删除所有容器
docker rm -f $(docker ps -a -q)
导出容器
使用docker export命令可将容器导出成一个压缩包文件。
docker export [OPTIONS] CONTAINER
Name,shorthand | Default | Description |
---|---|---|
–output,o | 将内容写到文件而非标准输出 |
docker export d8518c386c16 > latest.tar
docker export --output="latest.tar" d8518c386c16
导入容器
使用docker import命令即可从归档文件导入内容并创建镜像。
docker import [OPTIONS] file|URL|- [REPOSIORY[:TAG]]
Name,shorthand | Default | Description |
---|---|---|
–change,-c | 将Dockerfile指令应用到创建的镜像 | |
–message,-m | 为导入的镜像设置提交信息 |
docker import nginx2.tar nginx
将容器内文件复制到实体机
docker cp 容器id:容器内路径 实体机路径
查看日志
docker logs -f -t 容器
查看容器中进程信息ps
docker top 容器ID
查看镜像的元数据
docker inspect 容器ID
以上是关于Docker入门的主要内容,如果未能解决你的问题,请参考以下文章
Docker删除报错:Error response from daemon: conflict: unable to delete 08b152afcfae (must be forced)(代码片段
markdown [Docker] Docker片段列表和命令#linux #docker #snippets