一、Docker概述
Docker是一个开源的容器引擎,它有助于更快的交付应用。Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理。使用Docker,可更快地打包,测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。下面是Docker的架构图:
图中包含以下组件:
- Docker daemon(Docker守护进程):Docker daemon是一个运行在宿主机(DOCKER_HOST)的后台进程。可通过客户端与之通信;
- Client(Docker客户端):Docker客户端是Docker的用户界面,它可以接受用户命令和配置表示,并与Docker daemon通信。图中
docker build
等都是Docker的相关命令; - Images(Docker镜像):Docker镜像是一个只读模板,含创建Docker容器的说明,它与操作系统的安装光盘有点像;
- Container(容器): 镜像的运行实例,镜像与容器的关系类比面向对象中的类和对象;
- Registry:是一个集中存储与分发镜像的服务。最常用的Docker Registry是官方的Docker Hub。
二、安装Docker
Docker官方建议将Docker运行在linux操作系统上。Docker包含多种安装方式,例如Yum安装、RPM安装、Shell安装等。下面介绍以Yum在CentOS7.x上进行安装。可以参考官方文档:https://docs.docker.com/v1.13/engine/installation/linux/centos/
- 安装yun-utils,这样就能使用yun-config-manager工具设置Yum源。
$ sudo yum install -y yum-utils
如果出现以下信息:
已加载插件:fastestmirror, langpacks
/var/run/yum.pid 已被锁定,PID 为 3012 的另一个程序正在运行。
Another app is currently holding the yum lock; waiting for it to exit...
另一个应用程序是:PackageKit
内存:135 M RSS (1.4 GB VSZ)
已启动: Sun Aug 19 10:35:25 2018 - 04:56之前
状态 :睡眠中,进程ID:3012
需要执行
$ rm -rf /var/run/yum.pid
$ sudo yum install -y yum yum-utils
- 添加Docker的Yum源
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 更新Yum索引
$ sudo yum makecache fast
- 添加Yum仓库
$ tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
- 安装最新版本Docker
$ sudo yum -y install docker-engine
在生产系统可能需要添加指定版本的Docker,可以使用如下命令:
$ yum list docker-engine.x86_64 --showduplicates |sort -r
已加载插件:fastestmirror, langpacks
已安装的软件包
可安装的软件包
* updates: ftp.sjtu.edu.cn
Loading mirror speeds from cached hostfile
* extras: mirrors.shu.edu.cn
docker-engine.x86_64 1.9.1-1.el7.centos dockerrepo
docker-engine.x86_64 1.9.0-1.el7.centos dockerrepo
docker-engine.x86_64 1.8.3-1.el7.centos dockerrepo
docker-engine.x86_64 1.8.2-1.el7.centos dockerrepo
docker-engine.x86_64 1.8.1-1.el7.centos dockerrepo
docker-engine.x86_64 1.8.0-1.el7.centos dockerrepo
docker-engine.x86_64 1.7.1-1.el7.centos dockerrepo
docker-engine.x86_64 17.05.0.ce-1.el7.centos dockerrepo
docker-engine.x86_64 17.05.0.ce-1.el7.centos @dockerrepo
docker-engine.x86_64 17.04.0.ce-1.el7.centos dockerrepo
docker-engine.x86_64 17.03.1.ce-1.el7.centos dockerrepo
docker-engine.x86_64 17.03.0.ce-1.el7.centos dockerrepo
docker-engine.x86_64 1.7.0-1.el7.centos dockerrepo
docker-engine.x86_64 1.13.1-1.el7.centos dockerrepo
docker-engine.x86_64 1.13.0-1.el7.centos dockerrepo
docker-engine.x86_64 1.12.6-1.el7.centos dockerrepo
docker-engine.x86_64 1.12.5-1.el7.centos dockerrepo
docker-engine.x86_64 1.12.4-1.el7.centos dockerrepo
docker-engine.x86_64 1.12.3-1.el7.centos dockerrepo
docker-engine.x86_64 1.12.2-1.el7.centos dockerrepo
docker-engine.x86_64 1.12.1-1.el7.centos dockerrepo
docker-engine.x86_64 1.12.0-1.el7.centos dockerrepo
docker-engine.x86_64 1.11.2-1.el7.centos dockerrepo
docker-engine.x86_64 1.11.1-1.el7.centos dockerrepo
docker-engine.x86_64 1.11.0-1.el7.centos dockerrepo
docker-engine.x86_64 1.10.3-1.el7.centos dockerrepo
docker-engine.x86_64 1.10.2-1.el7.centos dockerrepo
docker-engine.x86_64 1.10.1-1.el7.centos dockerrepo
docker-engine.x86_64 1.10.0-1.el7.centos dockerrepo
第一列是软件包名称,第二列是版本字符串,第三列是仓库名称。可以使用以下命令安装指定版本的Docker
$ sudo yum -y install docker-engine-<VERSION_STRING>
例如:
$ sudo yum -y install docker-engine-1.10.0
- 启动Docker
$ sudo systemctl start docker
- 验证Docker是否安装正确
$ sudo docker run hello-world
如果看到如下结结果,则说明安装正确。
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9db2ca6ccae0: Pull complete
Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
- 查看Docker的版本
$ docker version
三、配置镜像加速器
国内访问Docker Hub的速度很不稳定,有时甚至连接不上,可以配置镜像加速器解决这个问题。国内很多云服务商提供镜像加速的服务,我们使用阿里云加速器https://cr.console.aliyun.com/cn-hangzhou/mirrors 。
执行以下命令:
$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://pzadm966.mirror.aliyuncs.com"]
}
EOF
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
四、Docker常用命令
Docker有很多的命令,这些命令有足浴控制Docker的行为。
4.1 Docker镜像常用命令
下面是Docker镜像常用的命令
- 搜索镜像
可以在Docker Hub主页上搜索镜像,可以通过docker search命令搜索:
$ docker search [OPTIONS] TERM
OPTIONS说明:
- --automated : 只列出 automated build类型的镜像;
- --no-trunc : 显示完整的镜像描述;
- -s : 列出收藏数不小于指定值的镜像
例如:
$ docker search -s 10 java
Flag --stars has been deprecated, use --filter=stars=3 instead
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
node Node.js is a JavaScript-based platform for... 6014 [OK]
tomcat Apache Tomcat is an open source implementa... 1985 [OK]
java Java is a concurrent, class-based, and obj... 1809 [OK]
openjdk OpenJDK is an open-source implementation o... 1138 [OK]
ghost Ghost is a free and open source blogging p... 807 [OK]
anapsix/alpine-java Oracle Java 8 (and 7) with GLIBC 2.23 over... 341 [OK]
jetty Jetty provides a Web server and javax.serv... 263 [OK]
couchdb CouchDB is a database that uses JSON for d... 221 [OK]
tomee Apache TomEE is an all-Apache Java EE cert... 55 [OK]
ibmjava Official IBM® SDK, Java™ Technology Editio... 52 [OK]
groovy Apache Groovy is a multi-faceted language ... 50 [OK]
lwieske/java-8 Oracle Java 8 Container - Full + Slim - Ba... 40 [OK]
cloudbees/jnlp-slave-with-java-build-tools Extends cloudbees/java-build-tools docker ... 19 [OK]
zabbix/zabbix-java-gateway Zabbix Java Gateway 13 [OK]
davidcaste/alpine-java-unlimited-jce Oracle Java 8 (and 7) with GLIBC 2.21 over... 11 [OK]
frekele/java docker run --rm --name java frekele/java 10 [OK]
该表格包含五列,含义如下:
- NAME:镜像仓库名称
- DESCRIPTION:镜像仓库描述
- STARS: 镜像仓库收藏数
- OFFICAL: 是否为官方库
- AUTOMATED:表示是否是自动构建的镜像仓库
- 下载镜像
$ docker pull [OPTIONS] NAME[:TAG]
OPTIONS说明:
- -a :拉取所有 tagged 镜像
- --disable-content-trust :忽略镜像的校验,默认开启
例如:
$ docker pull java #从Docker Hub中下载最新版本的Java镜像
$ docker pull reg.itmuch.com/java:8 #从指定Registry中下载标签为8的Java镜像
- 列出镜像
$ docker images [OPTIONS] [REPOSITORY[:TAG]
OPTIONS说明:
- -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
- --digests :显示镜像的摘要信息
- -f :显示满足条件的镜像;
- --format :指定返回值的模板文件;
- --no-trunc :显示完整的镜像信息;
- -q :只显示镜像ID
例如:
[root@simon01 yum.repos.d]# docker images java
REPOSITORY TAG IMAGE ID CREATED SIZE
java latest d23bdf5b1b1b 19 months ago 643MB
- 删除本地镜像
$ docker rmi [OPTIONS] IMAGE [IMAGE...]
OPTIONS说明:
- -f :强制删除;
- --no-prune :不移除该镜像的过程镜像,默认移除;
4.2 Docker容器常用命令
下面是Docker容器常用的命令
- 新建并启动容器
$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明(常用):
- -d: 后台运行容器,并返回容器ID;
- --name="nginx-lb": 为容器指定一个名称;
- -i:以交互模式运行容器,通常与 -t 同时使用;
- -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
- -P: 随机端口映射;
- -p: 指定端口映射,有以下四种格式
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort
- containerPort
- --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container:<name|id> 四种类型;
例如:
$ docker run -d -p 91:80 nginx
- 列出容器
$ docker ps [OPTIONS]
OPTIONS说明(常用):
- -a :显示所有的容器,包括未运行的。
- -f :根据条件过滤显示的内容。
- --format :指定返回值的模板文件。
- -l :显示最近创建的容器。
- -n :列出最近创建的n个容器。
- --no-trunc :不截断输出。
- -q :静默模式,只显示容器编号。
- -s :显示总的文件大小。
- 停止容器
$ docker stop CONTAINER_ID/CONTAIN_NAME
- 强制停止容器
$ docker kill CONTAINER_ID/CONTAIN_NAME
- 启动已停止容器
$ docker start CONTAINER_ID/CONTAIN_NAME
- 重启容器
$ docker restart CONTAINER_ID/CONTAIN_NAME
- 进入容器
$ docker exec -it CONTAINER_ID bash
- 删除容器
$ docker rm [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS说明(常用):
- -f :通过SIGKILL信号强制删除一个运行中的容器
- -l :移除容器间的网络连接,而非容器本身
- -v :-v 删除与容器关联的卷
更多命令见Docker的官方文档:https://docs.docker.com/edge/engine/reference/commandline/