一篇文章了解_docker
(一)Docker介绍
2018年10月6日 星期六
15:04
什么就Docker?
Docker是一个开源项目, 诞生于2013年初,最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。项目后来加入了Linux基金会,遵从了Apache 2.0协议,项目代码在GitHub 上进行维护。
Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker的基础是Linux容器(LXC)等技术。在LXC的基础上Docker进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。
为什么要使用Docker?
Docker 相比传统虚拟机有诸多优势。
- 启动速度更快: 秒级启动。
- 快速的部署和交付: 开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后, 运维人员可以直接使用这个容器来部署代码。
- 更高效的虚拟化: 它是内核级的虚拟化,因此可以实现更高的性能和效率。
- 高效的迁移: Docker可以运行在不同的平台,用户可以轻松的将一个应用从一个平台迁移到另一个平台。
- 节省开支: Docker容器除了运行其中应用外,基本不消耗额外的系统资源,一台设备可以运行上千个容器。
Docker基本概念
Docker包括三个基本概念
- 镜像(Image)
Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。镜像可以用来创建Docker容器。
- 容器(Container)
容器是从镜像创建的运行实例。它可以被启动、开始、停止、 删除。每个容器都是相互隔离的、保证安全的平台。
- 仓库(Repository)
仓库是集中存放镜像文件的场所。仓库分为公开仓库(Public)和私有仓库(Private) 两种形式。
最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 中国官方镜像加速
(二)Docker安装(Ubuntu)
2018年10月7日 星期日
12:20
Docker 支持多平台的安装(Linux/Windows/OS X)。
因为Docker原生支持Linux,所以,可以直接在Linux上运行,而且在Windows和 OS X 平台则需要借助轻量级的 Linux VM 运行。
Ubuntu安装
在Ubuntu上安装Docker的说明取决于您使用的是Docker企业版(Docker EE)还是Docker社区版(Docker CE)。
参考文档:https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/
使用仓库进行安装
首次在新的主机上安装Docker CE之前,需要设置Docker仓库。 之后,你可以从存储库安装和更新Docker。
设置仓库
1、更新 apt 包索引:
$ sudo apt-get update
2、安装软件包,使它允许apt通过HTTPS使用仓库:
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
3、添加Docker的官方GPG密钥:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
通过搜索密钥的最后8个字符,确认您现在已经拥有指纹 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 的密钥。
$ sudo apt-key fingerprint 0EBFCD88
pub 4096R/0EBFCD88 2017-02-22
密钥指纹 = 9DC8 5822
9FC7 DD38 854A E2D8 8D81 803C
0EBF CD88
uid Docker Release (CE
deb) <docker@docker.com>
sub 4096R/F273FCD8 2017-02-22
4、使用以下命令来设置 stable 的仓库。即使你想从 __edge __ 或 test 仓库安装构建,也总是需要 stable 的仓库。要添加 __edge __ 或 test 仓库,请在下面的命令中在单词stable之后添加edge或test(或两者)。
$
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
注意:上面的lsb_release -cs子命令返回你的Ubuntu发行版的名字,比如xenial。
安装Docker CE
1、更新 apt 包索引:
$ sudo apt-get update
2、安装最新版本有 Dcoker CE
$ sudo apt-get install docker-ce
3、在生产系统上,您应该安装特定版本的Docker CE,而不是始终使用最新版本。下面命令列出可用的版本。
$ apt-cache madison docker-ce
docker-ce | 17.12.0~ce-0~ubuntu | https://download.docker.com/linux/ubuntu
xenial/stable amd64
Packages
docker-ce | 17.09.1~ce-0~ubuntu | https://download.docker.com/linux/ubuntu
xenial/stable amd64
Packages
docker-ce | 17.09.0~ce-0~ubuntu | https://download.docker.com/linux/ubuntu
xenial/stable amd64
Packages
docker-ce | 17.06.2~ce-0~ubuntu | https://download.docker.com/linux/ubuntu
xenial/stable amd64
Packages
docker-ce | 17.06.1~ce-0~ubuntu | https://download.docker.com/linux/ubuntu
xenial/stable amd64
Packages
docker-ce | 17.06.0~ce-0~ubuntu | https://download.docker.com/linux/ubuntu
xenial/stable amd64
Packages
docker-ce | 17.03.2~ce-0~ubuntu-xenial |
https://download.docker.com/linux/ubuntu
xenial/stable amd64
Packages
docker-ce | 17.03.1~ce-0~ubuntu-xenial |
https://download.docker.com/linux/ubuntu
xenial/stable amd64
Packages
docker-ce | 17.03.0~ce-0~ubuntu-xenial |
https://download.docker.com/linux/ubuntu
xenial/stable amd64
Packages
安装指定的版本:
$ sudo apt-get install docker-ce=<VERSION>
4、通过运行hello-world 镜像验证Docker CE是否正确安装。
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
ca4f61b1923c: Pull complete
Digest: sha256:66ef312bbac49c39a89aa9bcc3cb4f3c9e7de3788c944158df3ee0176d32b751
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://cloud.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
其它
查看 Docker 版本:
$ sudo docker version
Client:
Version: 17.12.0-ce
API
version: 1.35
Go
version: go1.9.2
Git commit: c97c6d6
Built: Wed
Dec 27 20:11:19 2017
OS/Arch: linux/amd64
Server:
Engine:
Version: 17.12.0-ce
API version: 1.35
(minimum version 1.12)
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27
20:09:53 2017
OS/Arch: linux/amd64
Experimental: false
显示 Docker 系统信息,包括镜像和容器数:
$ sudo docker info
Containers: 7
Running: 0
Paused: 0
Stopped: 7
Images: 2
Server Version: 17.12.0-ce
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 20
Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null
overlay
Log: awslogs fluentd gcplogs gelf
journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 89623f28b87a6004d4b785663257362d1658a729
runc version: b2567b37d7b75eb4cf325b77297b140ea686ce8f
init version: 949e6fa
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 4.13.0-26-generic
Operating System: Ubuntu 16.04.3 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 1.924GiB
Name: ubuntu
ID: OXZY:HYGR:X6XJ:CLDF:H2UG:KXCY:J6MD:32WV:UORN:E2QY:TRTL:ISI6
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
WARNING: No swap limit support
(三)Docker 镜像
2018年10月7日 星期日
12:20
Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地, Docker 会从镜像仓库下载(默认是Docker Hub公共注册服务器中的仓库)。
Docker Hub:https://hub.docker.com 阿里云镜像:https://dev.aliyun.com/search.html 灵雀云:https://hub.alauda.cn/
镜像
查看镜像
列出本地镜像:
$ sudo docker images
REPOSITORY TAG
IMAGE ID CREATED SIZE
hello-world latest f2a91732366c 2 months ago
在列出信息中,可以看到几个字段信息:
- 来自于哪个仓库,比如 ubuntu
- 镜像的标记,比如 14.04
- 它的 ID 号(唯一)
- 创建时间
- 镜像大小
获取镜像
可以使用docker pull 命令来从仓库获取所需要的镜像。搜索 “ubuntu” 镜像。
$ sudo docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
8f7c85c2269a: Pull complete
9e72e494a6dd: Pull complete
3009ec50c887: Pull complete
9d5ffccbec91: Pull complete
e872a2642ce1: Pull complete
Digest: sha256:d3fdf5b1f8e8a155c17d5786280af1f5a04c10e95145a515279cf17abdf0191f
Status: Downloaded newer image for ubuntu:latest
该命令实际上相当于 $ docker pull registry.hub.docker.com/ubuntu 命令,即从注册服务器registry.hub.docker.com中的 ubuntu仓库来下载的镜像。
当然,官方的Docker hub 比较慢,我们也可以到国内的容器服务去下载镜像。
创建镜像
创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个。
做为一个 Docker 新手,我们先掌握如何使用别人的镜像,至于创建镜像放到后面介绍。
(四)Docker 容器
2018年10月7日 星期日
12:21
简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。 如果把镜像看成面向对象中的 类 的话,那么容器就是 类 的实例化 对象。
容器
启动容器
启动容器有两种方式,一种是基于镜像新建一个容器并启动, 另外一个是将在终止状态(stopped)的容器重新启动。
通过docker run 命令来启动容器。
查看运行帮助:
$ sudo docker run --help
下面的命令输出一个 “Hello World”,之后终止容器。
$ sudo docker
run ubuntu /bin/echo "hello world"
hello world
这跟在本地直接执行 /bin/echo 'hello world'几乎感觉不出任何区别。只不过,这里的输入是由通过 ubuntu 容器执行。
下面进入到ubuntu容器中。
$ sudo docker
run -t -i ubuntu /bin/bash
root@543a324ea841:/#
- -t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上。
- -i 则让容器的标准输入保持打开。
此时,你已经在ubuntu容器中了。这是一个独立的ubuntu 系统。通过 root@543a324ea841 标识可以看出。
当利用docker run 来创建容器时,Docker在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从地址池配置一个IP地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
退出容器,可以使用exit命令。
root@543a324ea841:/# exit
exit
fnngj@ubuntu:~$
守护状态运行
更多的时候,需要让 Docker容器在后台以守护态(Daemonized)形式运行。
$ sudo docker
run -d ubuntu /bin/echo "hello docker"
839fee657bfe893b9b2c76aebbb2b620efefc091a04fd90b1c5eda82b9e36730
- -d 表示容器以守护态(Daemonized)形式运行。
查看容器
通过 docker ps 命令查看当前运行的所有容器。
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
839fee657bfe ubuntu "/bin/echo 'hello do…" About a minute ago Exited (0) About a minute
ago musing_golick
543a324ea841 ubuntu "/bin/bash" 6
minutes ago Exited (0) About a minute
ago relaxed_shannon
578639b30db9 ubuntu "/bin/bash" 7
minutes ago Exited (0) 7 minutes
ago sad_ritchie
9797d4bcb1f6 ubuntu "/bin/echo 'hello wo…" 9 minutes ago Exited (0) 9 minutes ago cranky_keller
4d2cd63632c7
hello-world "/hello" 20
minutes ago Exited (0) 20 minutes
ago keen_stallman
获取容器的输出信息
通过docker logs命令。
$ sudo docker
logs musing_golick
hello docker
$ sudo docker logs 839fee657bfe
hello docker
musing_golick 为容器的 NAMES , 839fee657bfe 为容器的ID。通过 docker ps -a 命令查看。
停止容器
可以使用docker stop来终止一个运行中的容器。
$ sudo docker stop 0fc49a885fc2
重动容器
可以使用docker start 重动容器。
$ sudo docker start 0fc49a885fc2
删除容器
通过 docker rm 删除指定的容器。
sudo docker rm 0fc49a885fc2
0fc49a885fc2 为容器有 ID 。
(五)Docker 仓库
2018年10月7日 星期日
12:21
前面在下载镜像的适应已经用到了Docker仓库,如果是镜像的一个托管平吧。
仓库
一个容易混淆的概念是注册服务器(Registry)。 实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说, 仓库可以被认为是一个具体的项目或目录。例如对于仓库地址registry.hub.docker.com/ubuntu 来说,registry.hub.docker.com是注册服务器地址,ubuntu是仓库名。大部分时候,并不需要严格区分这两者的概念。
Docker Hub
目前Docker官方维护了一个公共仓库 Docker Hub:https://hub.docker.com
我们可以在Docker Hub上完成注册。这样就可以使用Docker Hub 来托管我们的镜像了。
通过docker search命令来查找官方仓库中的镜像,并利用docker pull 命令来将它下载到本地。
$ sudo docker search ubuntu
使用国内镜像
参考地址:https://www.docker-cn.com/registry-mirror
临时性的使用:
$ sudo docker pull registry.docker-cn.com/library/ubuntu:16.04
永久性的使用:
修改 /etc/docker/daemon.json文件(没有的话可以手动创建,需要通过root用户操作)并添加上 registry-mirrors 键值。
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
修改保存后重启Docker服务以使配置生效。
$ sudo service docker restart
(六) 创建Nginx容器
2018年10月7日 星期日
12:22
获取Nginx镜像
最简单的方法就是通过 docker pull nginx 命令来创建 Nginx容器。
$ sudo docker pull nginx
或者:
$ sudo docker pull registry.docker-cn.com/library/nginx
其中 registry.docker-cn.com 为国内的官方镜像仓库,速度要好很多。
启动Nginx容器
查看镜像:
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu
latest 2a4cca5ac898 8 days ago 111MB
registry.docker-cn.com/library/nginx
latest 3f8a4339aadd 4 weeks ago 108MB
hello-world
latest
f2a91732366c 2
months ago 1.85kB
启动 ngnnx 容器
$ sudo docker run --name some-nginx -d -p 8080:80 registry.docker-cn.com/library/nginx
b5bbf1dfe86a21d641a161c05598c0f4f4d4b32fc8d756b6fdf306295067625f
- -name 指定启动容器的名称为 some-nginx。
- -d 让Docker容器在后台以守护态(Daemonized)形式运行。
- -d 将容器的80端口映射到主机的8080端口
- registry.docker-cn.com/library/nginx 为启动容器的镜像。
访问Nginx服务器
处理过程: 浏览器 –> ubuntu(8080) –> Nginx容器(80)
备注:这里只是介绍如何把一个Nginx容器运行起来,然后,Nginx本身只是一个中间件,通过它来运行不同的Web项目才会真的有价值。
(七) 创建docker selenium容器
2018年10月7日 星期日
12:22
SeleniumHQ官方项目:https://github.com/seleniumHQ/docker-selenium 项目目前快速迭代中。
Selenium
这里主要针对的是 Selenium Grid,它用于分布式自动化测试,就是一套Selenium 代码可在不同的环境上运行。刚好,Docker可快速的创建各种环境。
Selenium Grid 有两个概念
hub :主节点,你可以看作 “北京总公司的测试经理”。
node:分支节点,你可以看作 “北京总公司的测试小兵A” 和 “上海分公司的测试小兵B”,还有 “深圳分公司的测试小兵C” …。
也就是说在Selenium Grid中只能有一个主hub,但可以在本地或远程建立 N 多个分支node,测试脚本指向主hub,由主hub 分配给本地/远程node 运行测试用例。
docker selenium 环境安装
以Ubuntu为例,在Ubuntu下安装Docker,请参考:Docker安装(Ubuntu)
docker hub(仓库):
https://hub.docker.com/r/selenium/hub/
1、下载主hub镜像(北京总公司的测试经理)
$ sudo docker pull selenium/hub
2、下载主node chrome 镜像(上海分公司的测试小兵B)
$ sudo docker pull selenium/node-chrome
3、查看镜像
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
selenium/node-chrome latest 1eba57bd3d79 12 days ago
823MB
selenium/hub latest d1437f7d9f87 12 days ago
285MB
4、启动主hub容器
$ sudo docker run -d -P --name selenium-hub selenium/hub
- -d 表示容器以守护态(Daemonized)形式运行。
- -P 表示 Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
5、启动分支node chrome 容器
$ sudo docker run -d --link selenium-hub:hub selenium/node-chrome
- –link 通过 link 关联 selenium-hub 容器,并为其设置了别名hub
6、查看容器
$ sudo docker
images
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9cd0dac69875
selenium/hub "/opt/bin/entry_poin…" 12 hours ago Up 12 hours
0.0.0.0:32768->4444/tcp
selenium-hub
18d139a6c36d
selenium/node-chrome "/opt/bin/entry_poin…" 12 hours ago Up 12 hours eloquent_gates
这里需要注意,Selenium/hub 容器的端口号为 4444,对Ubuntu映射的端口为 32768,前面通过 -P 参数自动分配。
工作原理:
selenium Grid脚本 -> ubuntu(32768) -> Hub容器(4444) -> Node Chrome 容器
创建Grid测试脚本与运行
1、编写Selenium Grid 脚本(grid_demo.py)
from selenium import webdriver
from time import sleep
driver = webdriver.Remote(
command_executor='http://127.0.0.1:32768/wd/hub',
desired_capabilities={'browserName': 'chrome'}
)
driver.get('https://www.baidu.com')
print("get baidu")
driver.find_element_by_id("kw").send_keys("docker
selenium")
driver.find_element_by_id("su").click()
sleep(1)
driver.get_screenshot_as_file("/home/fnngj/mypro/baidu_img.png")
driver.quit()
print("end...")
注意访问的端口号和浏览器,因为我们只启动了node chrome容器,如果这里设置Friefox的话,需要你启动 node firefox 容器,hub找不到合适的node会报错。
另外,我们为了验证脚本是否真的执行加上了打印和截图。
2、运行脚本
$ python3 grid_demo.py
get baidu
end...
3、查看截图
百度页面是被渲染出来了,但中文有乱码。
(八)Docker Dockerfile
2018年10月7日 星期日
12:23
虽然,前面已经会 使用 Nginx 和 docker selenium 来启动容器,但也仅仅是会使用,Dcoker 中还有许多概念和细节需要我们继续学习。
Dockerfile 文件分析
Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。
一般的 Dockerfile 分为四部分:基础镜像信息、 维护者信息、 镜像操作指令 和 容器启动时执行指令 。
以Selenium/Hub 的 Dockerfile 文件为例:
#
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# NOTE: DO *NOT* EDIT THIS FILE. IT IS
GENERATED.
# PLEASE UPDATE Dockerfile.txt INSTEAD OF THIS FILE
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
FROM selenium/base:3.8.1-erbium
LABEL authors=SeleniumHQ
USER seluser
#========================
# Selenium Configuration
#========================
EXPOSE 4444
# As integer, maps to "maxSession"
ENV GRID_MAX_SESSION 5
# In milliseconds, maps to "newSessionWaitTimeout"
ENV GRID_NEW_SESSION_WAIT_TIMEOUT -1
# As a boolean, maps to "throwOnCapabilityNotPresent"
ENV GRID_THROW_ON_CAPABILITY_NOT_PRESENT true
# As an integer
ENV GRID_JETTY_MAX_THREADS -1
# In milliseconds, maps to "cleanUpCycle"
ENV GRID_CLEAN_UP_CYCLE 5000
# In seconds, maps to "browserTimeout"
ENV GRID_BROWSER_TIMEOUT 0
# In seconds, maps to "timeout"
ENV GRID_TIMEOUT 30
# Debug
ENV GRID_DEBUG false
# As integer, maps to "port"
ENV GRID_HUB_PORT 4444
COPY generate_config \
entry_point.sh \
/opt/bin/
# Running this command as sudo just to avoid the message:
# To run a command as administrator (user "root"),
use "sudo <command>". See "man sudo_root" for details.
# When logging into the container
RUN /opt/bin/generate_config > /opt/selenium/config.json
CMD ["/opt/bin/entry_point.sh"]
- FROM
Dockerfile 都必须以 FROM 命令开始。 FROM命令会指定镜像基于哪个基础镜像创建,接下来的命令也会基于这个基础镜像。
- USER
指定运行容器时的用户名或 UID,后续的RUN、CMD、ENTRYPOINT也会使用指定用户。
- EXPOSE
告诉 Docker 服务端容器对外映射的本地端口,需要在 docker run 的时候使用-p或者-P选项生效。
- ENV
指定一个环节变量,会被后续 RUN 指令使用,并在容器运行时保留。
- CMD
CMD 有三种使用方式:
- CMD “executable”,“param1”,“param2”
- CMD “param1”,“param2”
- CMD command param1 param2 (shell form)
CMD指定在 Dockerfile 中只能使用一次,如果有多个,则只有最后一个会生效。
CMD的目的是为了在启动容器时提供一个默认的命令执行选项。如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令。
CMD会在启动容器的时候执行,build 时不执行,而RUN只是在构建镜像的时候执行,后续镜像构建完成之后,启动容器就与RUN无关了,这个初学者容易弄混这个概念,这里简单注解一下。
阅读 Dockerfile 文件的意义
阅读 Dockerfile 文件,可以帮助我们了解 容器启动时都做了哪些事情。我们还可以根据需求修改启动参数。
例如,Selenium/hub 的 Dockerfile 文件中定义,超时时间是30秒。
# In seconds,
maps to "timeout"
ENV GRID_TIMEOUT 30
如果需要修改这个参数,可以在启动 selenium-hub 时修改 GRID_TIMEOUT 参数。
$ sudo docker run -d -P --name selenium-hub -e GRID_TIMEOUT=10 selenium/hub
Dockerfile 文件中还是其它参数,参考:http://www.docker.org.cn/dockerppt/114.html
(九)创建 Docker 镜像
2018年10月7日 星期日
12:23
创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个。
修改已有的镜像
查看已有的镜像:
$ sudo docker
images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 2a4cca5ac898 9 days ago 111MB
下面进入到ubuntu容器中:
$ sudo docker
run -t -i ubuntu /bin/bash
root@543a324ea841:/#
注意: 记住容器的 ID,稍后还会用到。
在容器中添加 添加 Python3 开发环境。
root@543a324ea841:/# apt update // 更新软件源
root@543a324ea841:/# apt install python3 // 安装 python3
root@543a324ea841:/# exit // 退出 Ubuntu 容器
exit
当结束后,我们使用 exit 来退出,现在我们的容器已经被我们改变了,使用 docker commit 命令来提交更新后的副本。
$ sudo docker commit -m "Add python3" -a "Docker Newbee" 543a324ea841 ubuntu
sha256:7c0cf1cc5ef36a86252e94eea39c645f53be7dfda87bdcded6d2999917190ffd
- -m 来指定提交的说明信息,跟我们使用的版本控制工具一样;
- -a 可以指定更新的用户信息;
之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名。 创建成功后会返回这个镜像的ID信息。
查看镜像:
$ sudo docker images
REPOSITORY TAG
IMAGE ID CREATED SIZE
ubuntu latest 7c0cf1cc5ef3 About a minute ago 111MB
ubuntu <none> 2a4cca5ac898 9 days ago 111MB
之后,可以使用新的镜像来启动容器
$ sudo docker
run -t -i ubuntu:latest /bin/bash
root@8e40ef590fb1:/#
利用 Dockerfile 来创建镜像
使用 docker commit 来扩展一个镜像比较简单,但是不方便在一个团队中分享。我们可以使用 docker build 来创建一个新的镜像。为此,首先需要创建一个Dockerfile,包含一些如何创建镜像的指令。
新建一个目录和一个 Dockerfile
$ mkdir py
$ cd py
py$ touch Dockerfile
Dockerfile 中每一条指令都创建镜像的一层,例如:
$ vim Dockerfile
# this is a comment
FROM ubuntu:16.04
MAINTAINER Docker py <pyuser@docker.com>
RUN apt-get install -y python3
RUN apt-get install -y python3-pip
RUN python3 -m pip install selenium
Dockerfile 基本的语法是
- 使用 # 来注释
- FROM 指令告诉 Docker 使用哪个镜像作为基础
- 接着是维护者的信息
- RUN 开头的指令会在创建中运行,比如安装一个软件包,在这里使用apt 来安装了一些软件
编写完成 Dockerfile 后可以使用 docker build 来生成镜像。
sudo docker build -f Dockerfile -t ubuntu-py:v1 .
- -t标记来添加 tag,指定新的镜像的用户信息。
- “.” 是 Dockerfile 所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径
可以看到build 进程在执行操作。它要做的第一件事情就是上传这个 Dockerfile 内容,因为所有的操作都要依据 Dockerfile 来进行。 然后, Dockfile 中的指令被一条一条的执行。每一步都创建了一个新的容器,在容器中执行指令并提交修改(就跟之前介绍过的docker commit一样)。当所有的指令都执行完毕之后,返回了最终的镜像 id。所有的中间步骤所产生的容器都被删除和清理了。
(十)Docker Compose安装与创建Flask web应用
2018年10月7日 星期日
12:23
Docker Compose 是 Docker 官方编排(Orchestration)项目之一, 负责快速在集群中部署分布式应用。
Dockerfile 可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个Web服务容器再加上后端的数据库服务容器等。
安装
该项目由 Python 编写,实际上调用了 Docker 提供的 API 来实现。 通过pip安装。
$ python3 -m pip install docker-compose
安装成功后,可以查看docker-compose命令的用法。
$ docker-compose
Define and run multi-container applications with Docker.
Usage:
docker-compose [-f <arg>...]
[options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
-f, --file FILE Specify an alternate compose file
(default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name
(default: directory name)
--verbose Show more output
--no-ansi Do not print ANSI
control characters
-v, --version Print version and exit
-H, --host HOST Daemon socket to connect
to
……
创建 Flask 应用
创建使用Flask web应用,并将数值记入Redis。
1、创建 Web 应用
创建一个Flask web 应用,app.py 文件:
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
redis.incr('hits')
return 'Hello World! I have been seen %s times.' % redis.get('hits')
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
创建依赖文件 requirements.txt, 内容如下:
flask
redis
2、创建 Dockerfile
在同一目录下,创建 Dockerfile。
FROM python:3.5
ADD . /code
WORKDIR /code
RUN python3 -m pip install -r requirements.txt
CMD python3 app.py
对上面的Dockerfile做一下简单说明:
- 容器使用Python 3.5的镜像
- 将当前目录下文件拷贝到容器内/code
- 指定工作目录为/code
- 安装python需要的库:flask, redis
- 容器执行命令 python3 app.py
3、创建编排脚本
在同一目录下,创建 docker-compose.yml
version: '1'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
depends_on:
- redis
redis:
image: redis
对上面的编排脚本做一下简单说明:
- 这个应用定义了两个服务:web, redis
- web容器通过当前路径下的Dockerfile生成
- web容器内的5000端口映射到主机的5000端口
- 将当前目录挂载到web容器内/code
- web容器依赖于redis容器
- redis容器从Docker Hub获取镜像
所有文件都已经准备就绪。
$ ls
app.py docker-compose.yml Dockerfile
requirements.txt
4、启动应用
docker-compose执行编排脚本,分别制作和抓取web,redis镜像,启动容器。
$ sudo docker-compose up
……
redis_1 | 1:M 02 Feb 04:13:15.129 * Ready to accept
connections
web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
web_1 | * Restarting with stat
web_1 | * Debugger is active!
web_1 | * Debugger PIN: 170-376-971
整个过程会比较漫长。。。
5、访问应用
打开浏览器方位: http://0.0.0.0:5000/
效果如下:
来自 <http://www.testclass.net/docker/10-compose/>
(十一)Docker Compose创建Wordpress应用
2018年10月7日 星期日
12:24
wordpress是最常见博客系统,一般部署需要LAMP/WAMP环境,这介绍通过Docker compose对它进行编排和部署。
Docker Hub地址: https://hub.docker.com/_/wordpress/
wordpress 应用部署
1、 建立一个应用的目录
$ mkdir
wordpress
$ cd wordpress
2、创建 docker-compose.yml
version: '3.1'
services:
wordpress:
image: wordpress
restart: always
ports:
- 8081:80
environment:
WORDPRESS_DB_PASSWORD: pw123
mysql:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: pw123
- images 镜像名
- restart 指定版本
- ports 80为镜像端口, 映射的8081为主机端口。
- environment 环境配置,例,WORDPRESS_DB_PASSWORD 为wordpress数据库密码。
3、启动应用
docker-compose执行编排脚本,分别制作和抓取web,redis镜像,启动容器。
$ sudo docker-compose up
……
Creating wordpress_mysql_1 ... done
Creating wordpress_wordpress_1 ... done
整个过程会比较漫长。。。
5、访问应用
打开浏览器方位: http://0.0.0.0:5081/
进入wordpress安装配置界面:
(十二)Docker Machine介绍
2018年10月7日 星期日
12:24
官方文档:https://docs.docker.com/machine/overview/
可以使用Docker Machine做什么?
- 在Mac或Windows上安装并运行Docker
- 配置和管理多个远程Docker主机
- 提供Swarm集群
什么是Docker Machine?
Docker Machine是一个工具,可以让你在虚拟主机上安装Docker Engine,并用docker-machine命令管理主机。你可以使用计算机在本地Mac或Windows计算机上,公司网络,数据中心或云提供商(如Azure,AWS或Digital Ocean)上创建Docker主机。
使用docker-machine命令,你可以启动,检查,停止和重新启动托管主机,升级Docker客户端和守护进程,并配置Docker客户端与主机通信。
将机器CLI指向正在运行的托管主机,并且可以直接在该主机上运行docker命令。例如,运行docker-machine env default指向一个名为default的主机,按照屏幕上的说明完成env设置,然后运行docker ps,docker run hello-world等等。
Machine是在Docker v1.12之前在Mac或Windows上运行Docker的唯一方法。从测试版和Docker v1.12开始,Docker for Mac和Docker for Windows作为本地应用程序提供,并且是更新桌面和笔记本电脑上更好的选择。我们鼓励你尝试这些新的应用程序。 Docker for Mac和Docker for Windows的安装程序包括Docker Machine和Docker Compose。
如果你不确定从哪里开始,请参阅Docker入门,它将指导您完成Docker的简要端到端教程。
为什么要使用Docker Machine?
Docker Machine使你能够在各种类型的Linux上配置多个远程Docker主机。
此外,Machine允许你在旧版Mac或Windows系统上运行Docker,如上一主题中所述。
Docker Machine有这两个广泛的用例。
- 你有一个较旧的桌面系统,并希望在Mac或Windows上运行Docker
如果你主要工作不符合新版Docker for Mac和Docker for Windows应用程序要求的较旧的Mac或Windows笔记本电脑或台式机上,那么需要在本地运行Docker机器运行Docker Engine。使用Docker Toolbox安装程序在Mac或Windows上安装Docker Machine可以为本地虚拟机配置Docker Engine,使您能够连接它并运行docker命令。
- 我想在远程系统上配置Docker主机
Docker Engine在Linux系统上本地运行。如果你有一个Linux系统作为你的主系统,并且想要运行docker命令,你只需要下载并安装Docker Engine。但是,如果你想要在网络上,云中甚至本地配置多个Docker主机,需要一种高效的方法,那么需要Docker Machine。
无论的主系统是Mac,Windows还是Linux,都可以在其上安装Docker Machine,并使用docker-machine命令来配置和管理大量的Docker主机。它会自动创建主机,在其上安装Docker Engine,然后配置Docker客户端。每个托管主机(“机器”)是Docker主机和配置的客户机的组合。
Docker Engine和Docker Machine有什么区别?
当人们说“Docker”时,他们通常指的是Docker Engine,由Docker守护进程组成的 客户端-服务器 应用程序,指定与守护进程交互的接口的REST API,以及与守护进程交谈的命令行界面(CLI) (通过REST API包装)。 Docker Engine接受来自CLI的docker命令,如 docker run <image>,docker ps列出正在运行的容器,docker image ls列出镜像等等。
Docker Machine是一个配置和管理Docker化主机的工具(Docker Engine上的主机)。通常,在本地系统上安装Docker Machine。 Docker Machine拥有自己的命令行客户端docker-machine和Docker Engine客户端 docker。 你可以使用Machine在一个或多个虚拟系统上安装Docker Engine。这些虚拟系统可以是本地的(例如当你使用计算机在Mac或Windows上的VirtualBox上安装和运行Docker引擎)或远程(如使用计算机在云提供程序上配置Docker化主机时)。Docker化主机本身可以被认为是有时被称为管理的“Machine”。
(十三)Docker Machine安装
2018年10月7日 星期日
12:25
在macOS和Windows上,当你安装Docker for Mac,Docker for Windows或Docker Toolbox时,Machine将与其他Docker产品一起安装。
如果你只需要Docker Machine,则可以按照下一节中的说明直接安装Machine二进制文件。 你可以在GitHub上的docker/machine release 页面上找到最新版本的二进制文件。
直接安装
1、安装 Docker。
2、下载Docker Machine二进制文件并将其解压到PATH。
如果你是 macOS 系统,运行:
$
curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname
-m` >/usr/local/bin/docker-machine && \
chmod +x /usr/local/bin/docker-machine
如果你是 Linux 系统,运行:
$
curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname
-m` >/tmp/docker-machine && \
sudo install /tmp/docker-machine /usr/local/bin/docker-machine
如果你是 Windows 系统,通过Git BASH 运行:
$
if [[ ! -d "$HOME/bin" ]]; then
mkdir -p "$HOME/bin"; fi
&& \
curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-Windows-x86_64.exe > "$HOME/bin/docker-machine.exe" && \
chmod +x "$HOME/bin/docker-machine.exe"
注意:只有当你使用像Git BASH这样的支持Linux命令(如chmod)的终端模拟器时,上面的命令才能在Windows上运行。
3、查看 Machine 版本
$
docker-machine version
docker-machine version 0.13.0, build 9371605
(十四)Docker Machine基本使用
2018年10月7日 星期日
12:25
这一小节演示Machine的基本使用。
以 macOS 系统为例:
创建一个machine
指令:
$ docker-machine create --driver virtualbox my-machine
Creating CA:
/Users/fnngj/.docker/machine/certs/ca.pem
Creating client certificate: /Users/fnngj/.docker/machine/certs/cert.pem
Running pre-create checks...
Creating machine...
(my-machine) Copying /Users/fnngj/.docker/machine/cache/boot2docker.iso to
/Users/fnngj/.docker/machine/machines/my-machine/boot2docker.iso...
(my-machine) Creating VirtualBox VM...
(my-machine) Creating SSH key...
(my-machine) Starting the VM...
(my-machine) Check network to re-create if needed...
(my-machine) Found a new host-only adapter: "vboxnet0"
(my-machine) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this
virtual machine, run: docker-machine env my-machine
查看machine列表
指令:
$ docker-machine ls
NAME ACTIVE DRIVER
STATE URL SWARM DOCKER
ERRORS
my-machine - virtualbox Running
tcp://192.168.99.100:2376 v18.01.0-ce
可以看到我们刚创建的“my-machine”已出现在 machine 的列表当中。
查看 machine 的环境变量的配置信息。
指令:
$ docker-machine env my-machine
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/fnngj/.docker/machine/machines/my-machine"
export DOCKER_MACHINE_NAME="my-machine"
# Run this command to configure your
shell:
# eval $(docker-machine env
my-machine)
连接到machine的shell。
指令:
$ eval "$(docker-machine env my-machine)"
如果没有任何错误提示说明连接该 machine 成功了,因为该 machine 已安装了docker client,所以此时你可以执行 docker 的相关操作。如查看 Docker 版本指令:
$ docker --version
Docker version 18.01.0-ce, build 03596f5
用 docker run 启动一个容器验证前面的安装和设置没有问题。
指令:
$ docker run hello-world
获取指定 machine 的 ip
指令:
$ docker-machine ip my-machine
192.168.99.100
在容器中运行一个页面服务器(Nginx)
指令:
$ docker run -d -p 8080:80 --name web-server nginx
通过浏览器访问:http://192.168.99.100:8080
访问上面获取到的 ip 和映射的端口号组成的网址,这里是192.168.99.100:8080
指令:
$ curl $(docker-machine ip my-machine):8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0
auto;
font-family: Tahoma,
Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is
successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please
refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
通过同样的方法你可以创建和管理很多运行着 Docker 的本地 Machine(VMs);只需运行“docker-machine create”指令;而运行“docker-machine ls”则可以显示所有的 machine 组成的列表。
启动和停止 machines
停止指令: ··· $ docker-machine stop my-machine ···
启动指令:
$ docker-machine start my-machine
docker-machine 的指令列表:
- docker-machine config
- docker-machine env
- docker-machine inspect
- docker-machine ip
- docker-machine kill
- docker-machine provision
- docker-machine regenerate-certs
- docker-machine restart
- docker-machine ssh
- docker-machine start
- docker-machine status
- docker-machine stop
- docker-machine upgrade
- docker-machine url