docker学习(二):入门实战篇
Docker环境的安装
(由于我是win7系统,所以以win7系统为例)
(win7已停止更新,附加win10 docker desktop安装)
win7系统
win7系统需要利用 docker toolbox 来安装,国内可以使用阿里云的镜像来下载,下载地址:http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/
docker toolbox是一个工具集,里面主要包含以下内容:
- Docker CLI:客户端,用来运行docker引擎创建镜像和容器
- Docker Machine:可以让你在windows的命令行中运行docker引擎命令
- Docker Compose:用来运行docker-compose命令
- Kitematic:这是Docker的GUI版本
- Docker QuickStart shell:这是一个已经配置好Docker的命令行环境
- Oracle VM Virtualbox:虚拟机
- Git:版本控制系统
下载完成之后,直接开始安装,安装到最后的工具的选择的时候,如果电脑里已经有了git,virtualbox之类的话,就可以不用再次安装了,把对应的选项前面的复选框里的勾勾去掉就好了。安装完成,桌面应该会有这3个图标:
点击 Docker QuickStart 图标来启动 Docker Toolbox 终端。
出现如图所示,则登陆成功。
win10系统
win10系统中的docker叫,docker desktop,下载地址:https://www.docker.com/products/docker-desktop
下载安装完成之后,打开你的cmd命令行,输入docker -v,如显示版本号,docker desktop就安装好了,想用的时候打开cmd就可以了。
Docker Hello World
作为一个程序员的习惯,装了一个新的环境,怎么能不输出一下Hello World呢。
Docker允许我们使用docker run下容器内来运行一个应用程序
docker run ubuntu:15.10 /bin/echo "Hello world"
各参数解析:
- docker:Docker的二进制执行文件,基本上命令都是以它开头。
- run:与前面的docker组合来运行一个容器。
- ubuntu:15.10指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
- /bin/echo “Hello world”: 在启动的容器里执行的命令
我们还可以通过docker的两个参数 -i -t,让docker运行的容器实现"对话"的能力。
docker run -i -t ubuntu:15.10 /bin/bash
各参数解析:
- -t:在新容器内指定一个伪终端或终端。
- -i:允许你对容器内的标准输入 (STDIN) 进行交互。
- /bin/bash:作用是因为docker后台必须运行一个进程,否则容器就会退出,在这里表示启动容器后启动bash。
这时候已经进入了ubuntu15.10系统的容器了,可以输入一些命令,如cat /proc/version、ls等指令来查看一下当前系统的版本信息和当前目录下的文件列表,想要退出时,输入exit指令即可。
当运行以下命令来创建一个以进程方式运行的容器:
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
输出的不是期望的hello world,而是一长串的英数字符。其实呢,这字符叫做容器ID,它具有唯一性,可以通过容器ID来查看对应的容器发生了什么。
首先,得确认刚才的容器是否在运行,可以输入 docker ps 指令来查看。
- CONTAINER ID:就是容器ID
- IMAGE:用的是哪个镜像创建的
- NAMES:自动分配的容器名称
- COMMAND:创建容器的命令
使用 docker logs 命令+ 容器ID 可以查看容器内的标准输出。
会看到刚才创建的容器一直在输出hello world,只不过是处于后台模式。
如果想要停止这个容器,可以使用 docker stop 命令 + 容器ID。
Docker容器的使用
Docker客户端
我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。
可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。
例如我们要查看 docker stats 指令的具体使用方法,可以输入以下命令:
docker stats --help
运行一个web应用
输入以下命令在docker容器中运行一个 Python Flask 应用来运行一个web应用。
docker pull training/webapp # 载入镜像
docker run -d -P training/webapp python app.py
各参数说明:
- -d:让容器在后台运行。
- -P:将容器内部使用的网络端口映射到我们使用的主机上。
查看web应用容器
使用 docker ps 命令查看正在运行的容器:
这里面比之前多了一个端口信息。
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32768 上。
这时我们可以通过浏览器访问WEB应用。
我们也可以通过 -p 参数来设置不一样的端口:
docker run -d -p 5000:5000 training/webapp python app.py
docker ps 查看正在运行的容器
会发现容器内部的 5000 端口映射已经到我们本地主机的 5000 端口上了。
网络端口的快捷方式
通过 docker ps 命令可以查看到容器的端口映射,docker 还提供了另一个快捷方式 docker port,使用 docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。
上面我们创建的 web 应用容器 ID 为 034f6a44b9c0 名字为 youthful_ride。
就可以使用 docker port 034f6a44b9c0 或 docker port youthful_ride 来查看容器端口的映射情况。
其余常用命令
- 查看 WEB 应用程序日志:docker logs [ID或者名字]
- 查看WEB应用程序容器的进程:docker top [ID或者名字]
- 查看 Docker 的底层信息:docker inspect [ID或者名字]
- 停止 WEB 应用容器:docker stop [ID或者名字]
- 重启WEB应用容器:docker start [ID或者名字] /docker restart [ID或者名字]
- 移除WEB应用容器:docker rm [ID或者名字]
管理容器数据
一般情况下,随着容器的创建和销毁,容器中的所有数据都会一同被销毁,但有的时候想要将数据保存下来,能够在其它情况下也能使用,即数据的持久化。如何做到这一点呢?其实很简单,只需要将宿主机的目录挂载到容器中就可以了,最常用的方式就是数据卷。
数据卷
数据卷是指存在于一个或多个容器中的特定目录,能够绕过Union File System提供一些用于持续存储或共享数据的特性。
- 数据卷可在容器间共享或重复使用
- 数据卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
# docker volume create XXX 创建一个自定义的容器卷
# docker volume inspect XXX 查看一个或多个指定容器卷的详细信息
# docker volume ls 查看所有的数据卷
# docker volume prune 删除所有的没有被使用的数据卷
# docker volume remove 删除一个或多个volumes
可以在docker run命令中使用 -v 标识添加数据卷:
docker run (-d) --name nginx -v /data -tid XXXXXXXX /bin/bash
- nginx:镜像名
- /data:容器中想要挂载的目录
- xxxxxxxx:镜像ID
- /bin/bash:/bin/bash的作用是因为docker后台必须运行一个进程,否则容器就会退出,在这里表示启动容器后启动bash
Docker镜像使用
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。
列出镜像列表
runoob@runoob:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 90d5884b1ee0 5 days ago 188 MB
php 5.6 f40e9e0f10c8 9 days ago 444.8 MB
nginx latest 6f8d099c3adc 12 days ago 182.7 MB
mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB
httpd latest 02ef73cf1bc0 3 weeks ago 194.4 MB
ubuntu 15.10 4e3b13c8a266 4 weeks ago 136.3 MB
hello-world latest 690ed74de00f 6 months ago 960 B
training/webapp latest 6fae60ef3446 11 months ago 348.8 MB
各项说明:
- REPOSITORY:表示镜像的仓库源。
- TAG:镜像的标签,也可以理解成版本号。
- IMAGE ID:镜像ID。
- CREATED:镜像创建时间。
- SIZE:镜像大小。
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如ubuntu仓库源里,有15.10、14.04等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:
docker run -t -i ubuntu:15.10 /bin/bash # 必须加上版本号
如果你不指定一个镜像的版本标签,docker 将默认使用 ubuntu:latest 镜像。
获取新镜像
当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。如下:
docker pull ubuntu:15.10
查找镜像
我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个httpd的镜像来作为我们的web服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。
- NAME:镜像仓库源的名称。
- DESCRIPTION:镜像的描述。
- OFFICIAL:是否docker官方发布。
更新镜像
更新镜像之前,我们需要使用镜像来创建一个容器。
在运行的容器内使用 apt-get update 命令进行更新。
在完成操作之后,输入 exit命令来退出这个容器。
- -m:提交的描述信息。
- -a:指定镜像作者。
- 5e37ae08c371:容器ID。
- runoob/ubuntu:v2:指定要创建的目标镜像名。
我们可以使用 docker images 命令来查看我们的新镜像 runoob/ubuntu:v2:
构建镜像
使用 docker commit 来扩展一个镜像比较简单,但是不方便在一个团队中分享。我们可以使用 docker build 来创建一个新的镜像。为此,首先需要创建一个 Dockerfile,包含一些如何创建镜像的指令。
首先新建一个目录和一个 Dockerfile。
$ mkdir [文件名] # 创建目录
$ cd [文件名] # 进入刚刚创建的目录
$ touch Dockerfile # 创建Dockerfile
$ vi Dockerfile # 进入Dockerfile的编辑模式
输入如下代码:
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
FROM指令指定使用的镜像源。
RUN指令后面都是告诉docker在镜像内要执行的命令。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
可以看到命令的最后,runoob/centos:6.7已经被成功创建。
参数说明:
- -t :指定要创建的目标镜像名。
- . :Dockerfile 文件所在目录,也可以指定Dockerfile 的绝对路径
使用 docker images 可以看到镜像已经存在。
设置镜像标签
可以通过 docker tag 命令,为镜像添加新标签。
docker tag 9ce20ee7a8ff runoob/centos:dev
使用 docker images 命令可以看到,ID为9ce20ee7a8ff的镜像多了一个标签。
Docker-Compose
当一个容器对应着多个镜像或者要定义一组相关联的应用容器时,这时候,就需要创建一个docker-compose.yml文件来进行配置,但是这个文件并不能解决负载均衡的问题。
yml文件主要包含以下几个参数:
- build:指定 Dockerfile 所在文件夹的路径。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
- image:指定为镜像名称或镜像 ID。如果镜像在本地不存在,将会尝试拉去这个镜像。
- container_name:自定义的容器名。
- ports:端口号。两个的时候,一个对应外网端口,一个对应容器内部的端口。
- links:链接到其它服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名 (SERVICE:ALIAS) 格式都可以。
- environment:设置环境变量。你可以使用数组或字典两种格式。(只给定名称的变量会自动获取它在 Compose 主机上的值,可以用来防止泄露不必要的数据。)
- volumes:卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。
准备完毕后,通过 docker-compose up 命令来启动。