Docker是一個開源的引擎,能夠輕鬆的爲任何應用建立一個輕量級的、可移植的、自給自足的容器。開發者在筆記本上編譯測試經過的容器能夠批量地在生產環境中部署,包括VMs(虛擬機)、bare metal、OpenStack 集羣和其餘的基礎應用平臺。mysql
對開發而言,使用 docker 就能夠很是方便的集成開發環境,不須要繁瑣的安裝,只須要用 docker 拉取一個鏡像啓動便可;環境問題這種大坑,使用 Docker 直接跳過,如把 Mysql、Redis、Mongo… 等開發須要用的數據庫作成一個鏡像,或者 JAVA、Nodejs、Python… 等作成鏡像,能夠保持環境一致,節約開發成本。linux
在 Linux 上,安裝(以 Ubuntu 爲例):c++
# 安裝 Docker 須要 curl > which curl # root 不須要 sudo # > apt-get update && sudo apt-get install curl # > sudo apt-get install curl > curl -fsSL https://get.docker.com/ | sh
在 Mac/Windows 上,宿主平臺不支持 Docker 直接運行,於是 Docker 在這兩個系統上運行在 VirtualBox 中(Docker 官方提供一鍵安裝教程 Mac 和 Windows ,提供 Docker Toolbox 一鍵安裝/運行)。git
各個平臺的安裝其實都不太同樣,官方給了每一個平臺的安裝方法如:redis
Ubuntusql
Red Hatmongodb
CentOSdocker
…shell
使用 Docker 以前,請先修改源,參考章節 修改 Docker 源 。數據庫
與 VM 技術不一樣,Docker 運行在宿主平臺(Linux系列)上:
Docker 使用 Linux Containers 技術,即基於容器的操做系統層級虛擬化技術,可是又有區別:
詳細區別能夠參考這裏。
Docker 使用以下結構來提供服務:
Docker 服務啓動後, Docker 客戶端可使用 docker
命令 拉取/構建/推送/運行 Images 。每一個 Image 運行的時候都跑在一個 Container 中。
Images:鏡像,是一系列只讀模板(layers)的集合,內核是最底層(第 0 層),不能被修改或保持狀態。一個 Docker 鏡像基於另外一個 Docker 鏡像,相似於繼承。
第 1 層的鏡像(Base Image)爲基本的系統如 Ubuntu、CentOS,其餘層的鏡像(除了最頂層)稱爲父層鏡像(Parent Image)。建立對象的時候,基本都是以其餘鏡像爲基礎:
# 基礎鏡像 FROM centos:6 # or FROM ubuntu:latest # 應用鏡像 FROM mysql:latest
Containers:容器,在全部的鏡像層之上增長一個可寫層。這個可寫層有運行在 CPU 上的進程,並且有兩個不一樣的狀態:運行態(Running)和退出態(Exited)。
因此同一個鏡像能夠運行在多個 Container 之中,互不影響。
註冊 Docker Hub ,便可打開新世界的大門。
然而 Docker Hub 拉取鏡像灰常慢,因此加一個鏡像源來加速。到 daocloud/阿里雲 之類的服務上去註冊一個鏡像服務,而後修改 Docker 的配置:
Linux
修改 `/etc/sysconfig/docker` ,添加 `other_args="--registry-mirror=${yours}"`
Mac / Windows
`docker-machine create` / `boot2docker init` 建立 docker 虛擬機的時候,有一個參數是`--engine-registry-mirror [--engine-registry-mirror option --engine-registry-mirror option] Specify registry mirrors to use` 。建立時帶上這個參數就行了。
若是是官方一鍵安裝,能夠修改/Applications/Docker/Docker\Quickstart\Terminal.app/Contents/Resources/Scripts/start.sh
爲 create
添加參數。
Windows 木有研究,可是應該也是相似的修改方法。
啓動 Docker以後,便可使用 docker
命令:
Usage: docker [OPTIONS] COMMAND [arg...] docker [ --help | -v | --version ] A self-sufficient runtime for containers. Options: --config=~/.docker Location of client config files -D, --debug Enable debug mode -H, --host=[] Daemon socket(s) to connect to -h, --help Print usage -l, --log-level=info Set the logging level --tls Use TLS; implied by --tlsverify --tlscacert=~/.docker/ca.pem Trust certs signed only by this CA --tlscert=~/.docker/cert.pem Path to TLS certificate file --tlskey=~/.docker/key.pem Path to TLS key file --tlsverify Use TLS and verify the remote -v, --version Print version information and quit Commands: attach Attach to a running container build Build an image from a Dockerfile commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes on a container's filesystem events Get real time events from the server exec Run a command in a running container export Export a container's filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information inspect Return low-level information on a container or image kill Kill a running container load Load an image from a tar archive or STDIN login Register or log in to a Docker registry logout Log out from a Docker registry logs Fetch the logs of a container network Manage Docker networks pause Pause all processes within a container port List port mappings or a specific mapping for the CONTAINER ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart a container rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save an image(s) to a tar archive search Search the Docker Hub for images start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop a running container tag Tag an image into a repository top Display the running processes of a container unpause Unpause all processes within a container update Update resources of one or more containers version Show the Docker version information volume Manage Docker volumes wait Block until a container stops, then print its exit code Run 'docker COMMAND --help' for more information on a command.
每一個命令解釋的很清楚,還可使用 docker COMMAND --help
查看命令詳細介紹。
以 centos:6
爲例,先從 docker hub 拉取鏡像:
> docker pull centos:6
由於這是一個基礎鏡像,因此啓動也就是開啓一個 bash ,這樣就進入到 container
內部了:
> docker run -it centos:6 /bin/bash [root@4a2e60863aa8 /]#
Docker 鏡像依靠 Dockerfile 構建,下面給個示例,咱們構建一個包含 Redis、Mysql、MongoDB 的鏡像。
Docker 命令和 Linux 命令很是類似,若是對 Linux 命令模式不熟悉,建議先去熟悉這塊。
# 以 centos 爲基礎 FROM centos:6 # 維護者 MAINTAINER Zhang Xun <xtkml.g@gmail.com> # ${NAME} <${EMAIL}> # epel 源,提供不少包 RUN yum -y install epel-release \ && yum -y update \ && yum -y install sudo wget unzip tar git systemd glib-devel # 一些基礎 lib # gcc,centos 6 的 gcc 太老了,裝 4.8 RUN wget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtools-2.repo \ && yum -y install devtoolset-2-gcc devtoolset-2-binutils devtoolset-2-gcc-c++ \ && ln -s /opt/rh/devtoolset-2/root/usr/bin/* /usr/local/bin/ \ # link symbol && hash -r # refresh path # mysql 5.6 from official repo RUN wget http://repo.mysql.com/mysql-community-release-el6-7.noarch.rpm \ && rpm -ivh mysql-community-release-el6-7.noarch.rpm \ && rm -rf mysql-community-release-el6-7.noarch.rpm \ && yum -y install mysql-server # reids RUN yum -y install redis # mongodb from official repo RUN { \ echo '[mongodb-org-3.2]'; \ echo 'name=MongoDB Repository'; \ echo 'baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/'; \ echo 'gpgcheck=1'; \ echo 'enabled=1'; \ echo 'gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc'; \ } > /etc/yum.repos.d/mongodb-org-3.2.repo \ && yum -y install mongodb-org \ # 安裝 && sed -i 's/bindIp/#bindIp/g' /etc/mongod.conf # 開啓遠程鏈接 # 暴露端口 # 若是不須要在 docker 外面鏈接數據庫,則不須要開啓端口,也不須要打開 mongo 和 mysql 的遠程權限 EXPOSE 3306 # mysql port EXPOSE 6379 # redis port EXPOSE 27017 # mongo port # clean RUN yum -y clean all # 數據庫啓動腳本 ADD start.sh /start.sh RUN chmod +x /start.sh # 若是想讓鏡像不以 root 用戶運行,能夠添加一個用戶 # RUN useradd -d /home/base -m -s /bin/bash -p 123456 base # RUN echo -e "base\tALL=(ALL)\tNOPASSWD: ALL\n" >> /etc/sudoers # USER base # /etc/sudoers,容許 shell 腳本使用 sudo 命令,非 root 用戶須要修改這項 # RUN sed -i 's/Defaults\s*requiretty/#Defaults requiretty/g' /etc/sudoers # 運行鏡像的時候,入口腳本 CMD sh -c "bash /start.sh run"
#!/usr/bin/env bash # start db,若是是非 root 用戶,須要使用 sudo 命令 service mysqld start service mongod start redis-server > ~/.redis.log & # 開啓 mysql root 遠程鏈接權限 mysql -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;" -uroot echo 'start' # 開啓一個 bash 進程保持鏡像一直運行 /bin/bash
build
& push
構建鏡像:
docker build -t zzxun/develop-env-basic . # 巴拉巴拉一大堆 log
等待構建成功。
以後使用 images
命令查看鏡像列表:
> docker images REPOSITORY TAG IMAGE ID CREATED SIZE zzxun/develop-env-basic latest b1af590d971c 8 minutes ago 1.311 GB centos 6 fc73b108c5ae 2 weeks ago 228.9 MB
能夠把鏡像推送到 Docker Hub:
docker push zzxun/develop-env-basic
run
運行鏡像,使用 run -d
讓鏡像在後臺運行:
# 命名 container 爲 env docker run -it -d --name env -p 3306:3306 -p 27017:27017 -p 6379:6379 zzxun/develop-env-basic # 還可使用 -v 命令掛載宿主機文件 docker run -it -d --name env -v ~/git-space:/data/git-space -p 3306:3306 -p 27017:27017 -p 6379:6379 zzxun/develop-env-basic # 若是隻在 docker 中運行,則更本不須要開啓端口,即關閉 Dockerfile 中的 EXPOSE(須要從新構建) docker run -it -d --name env -v ~/git-space:/data/git-space zzxun/develop-env-basic # 更多參數使用 docker run --help 查看
以後使用 ps
查看正在運行的容器:
> docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5a846421b812 zzxun/develop-env-basic "/bin/sh -c 'sh -c \"b" 2 minutes ago Up 5 hours 0.0.0.0:3306->3306/tcp, 0.0.0.0:6379->6379/tcp, 0.0.0.0:27017->27017/tcp env
使用 exec
能夠進入 container 內部,上一步給 container 取了別名,因此能夠直接使用別名,也可使用 container id(輸入前幾個字母就行了,docker 會自動查找匹配)。
> docker exec -it env bash # 或者 docker exec -it 5a bash [root@5a846421b812 /]#
若是是 Linux 系統,則能夠直接鏈接 127.0.0.1:3306/6379/27017
。
Mac 和 Windows 系統下,由於 Docker 運行在虛擬機中,因此使用:
> docker-machine ip 192.168.99.100
則可鏈接 192.168.99.100:3306/6379/27017
使用數據庫。