2018年10月6日 星期六html
15:04node
什么就Docker?python
Docker是一个开源项目, 诞生于2013年初,最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。项目后来加入了Linux基金会,听从了Apache 2.0协议,项目代码在GitHub 上进行维护。mysql
Docker项目的目标是实现轻量级的操做系统虚拟化解决方案。Docker的基础是Linux容器(LXC)等技术。在LXC的基础上Docker进行了进一步的封装,让用户不须要去关心容器的管理,使得操做更为简便。用户操做Docker的容器就像操做一个快速轻量级的虚拟机同样简单。linux
为何要使用Docker?nginx
Docker 相比传统虚拟机有诸多优点。git
Docker基本概念github
Docker包括三个基本概念web
Docker提供了一个很简单的机制来建立镜像或者更新现有的镜像,用户甚至能够直接从其余人那里下载一个已经作好的镜像来直接使用。镜像能够用来建立Docker容器。redis
容器是从镜像建立的运行实例。它能够被启动、开始、中止、 删除。每一个容器都是相互隔离的、保证安全的平台。
仓库是集中存放镜像文件的场所。仓库分为公开仓库(Public)和私有仓库(Private) 两种形式。
最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 中国官方镜像加速
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。
设置仓库
一、更新 apt 包索引:
$ sudo apt-get update
二、安装软件包,使它容许apt经过HTTPS使用仓库:
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
三、添加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
四、使用如下命令来设置 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
一、更新 apt 包索引:
$ sudo apt-get update
二、安装最新版本有 Dcoker CE
$ sudo apt-get install docker-ce
三、在生产系统上,您应该安装特定版本的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>
四、经过运行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
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
在列出信息中,能够看到几个字段信息:
获取镜像
可使用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 新手,咱们先掌握如何使用别人的镜像,至于建立镜像放到后面介绍。
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:/#
此时,你已经在ubuntu容器中了。这是一个独立的ubuntu 系统。经过 root@543a324ea841 标识能够看出。
当利用docker run 来建立容器时,Docker在后台运行的标准操做包括:
退出容器,可使用exit命令。
root@543a324ea841:/# exit
exit
fnngj@ubuntu:~$
守护状态运行
更多的时候,须要让 Docker容器在后台以守护态(Daemonized)形式运行。
$ sudo docker run -d ubuntu /bin/echo "hello docker"
839fee657bfe893b9b2c76aebbb2b620efefc091a04fd90b1c5eda82b9e36730
查看容器
经过 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 。
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
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
访问Nginx服务器
处理过程: 浏览器 –> ubuntu(8080) –> Nginx容器(80)
备注:这里只是介绍如何把一个Nginx容器运行起来,而后,Nginx自己只是一个中间件,经过它来运行不一样的Web项目才会真的有价值。
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/
一、下载主hub镜像(北京总公司的测试经理)
$ sudo docker pull selenium/hub
二、下载主node chrome 镜像(上海分公司的测试小兵B)
$ sudo docker pull selenium/node-chrome
三、查看镜像
$ 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
四、启动主hub容器
$ sudo docker run -d -P --name selenium-hub selenium/hub
五、启动分支node chrome 容器
$ sudo docker run -d --link selenium-hub:hub selenium/node-chrome
六、查看容器
$ 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测试脚本与运行
一、编写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会报错。
另外,咱们为了验证脚本是否真的执行加上了打印和截图。
二、运行脚本
$ python3 grid_demo.py
get baidu
end...
三、查看截图
百度页面是被渲染出来了,但中文有乱码。
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"]
Dockerfile 都必须以 FROM 命令开始。 FROM命令会指定镜像基于哪一个基础镜像建立,接下来的命令也会基于这个基础镜像。
指定运行容器时的用户名或 UID,后续的RUN、CMD、ENTRYPOINT也会使用指定用户。
告诉 Docker 服务端容器对外映射的本地端口,须要在 docker run 的时候使用-p或者-P选项生效。
指定一个环节变量,会被后续 RUN 指令使用,并在容器运行时保留。
CMD 有三种使用方式:
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
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
以后是用来建立镜像的容器的 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 基本的语法是
编写完成 Dockerfile 后可使用 docker build 来生成镜像。
sudo docker build -f Dockerfile -t ubuntu-py:v1 .
能够看到build 进程在执行操做。它要作的第一件事情就是上传这个 Dockerfile 内容,由于全部的操做都要依据 Dockerfile 来进行。 而后, Dockfile 中的指令被一条一条的执行。每一步都建立了一个新的容器,在容器中执行指令并提交修改(就跟以前介绍过的docker commit同样)。当全部的指令都执行完毕以后,返回了最终的镜像 id。全部的中间步骤所产生的容器都被删除和清理了。
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作一下简单说明:
3、建立编排脚本
在同一目录下,建立 docker-compose.yml
version: '1'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
depends_on:
- redis
redis:
image: redis
对上面的编排脚本作一下简单说明:
全部文件都已经准备就绪。
$ 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/>
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
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安装配置界面:
2018年10月7日 星期日
12:24
官方文档:https://docs.docker.com/machine/overview/
可使用Docker Machine作什么?
什么是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有这两个普遍的用例。
若是你主要工做不符合新版Docker for Mac和Docker for Windows应用程序要求的较旧的Mac或Windows笔记本电脑或台式机上,那么须要在本地运行Docker机器运行Docker Engine。使用Docker Toolbox安装程序在Mac或Windows上安装Docker Machine能够为本地虚拟机配置Docker Engine,使您可以链接它并运行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”。
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
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 的指令列表: