docker 即容器mysql
Docker 遠程鏡像倉庫git
DockerHubweb
DaoCloud / Aliyunredis
Docker Images
是用來建立 docker 容器的只讀模版,其中包含了容器啓動所須要的全部配置信息和運行程序,一次構建以後能夠屢次複用。sql
從結構上來說,Docker Image
是分層次的,如圖所示:docker
這樣就天然出現了父鏡像和基礎鏡像的概念,在圖中,每個上層鏡像都是依賴於下一層的鏡像,因此下層鏡像可稱爲上層鏡像的父鏡像,而最底層的鏡像是沒有父鏡像的,可稱其爲基礎鏡像(Base Image)。shell
實際場景下,通常咱們本身建立的鏡像都會依賴於某個 Linux
操做系統的鏡像,例如 ubuntu
,大多數狀況下,咱們可稱其爲基礎鏡像,可是咱們也能夠查看 ubuntu
鏡像的 Dockerfile
會發現,它也是依賴於一個叫 scratch
的鏡像,scratch
是 docker
的一個空鏡像,裏面只有 docker
加入的一些元數據,若是咱們想要追求本身的鏡像儘量的輕量,也能夠將 scratch
鏡像做爲咱們的基礎鏡像來構建。ubuntu
Dockerfile
是用來講明如何自動構建 docker image
的指令集文件,在 Dockerfile
中編寫好指令集以後,咱們就能夠經過 docker build
命令構建鏡像,Dockerfile
文件中命令的順序就是構建過程當中執行的順序。vim
如下爲幾個經常使用的指令:數組
全部 Dockerfile
都必須以 FROM
命令開始,表示其依賴的鏡像。
FROM image_name
MAINTAINER author <author_email>
RUN <command>
ADD /path/to/sourcefile/in/host /path/to/targetfile/in/container
CMD ["executable","param1","param2"]
EXPOSE <port>
RUN
、CMD
與 ENTRYPOINT
命令的工做目錄WORKDIR /path/to/workdir/in/container
VOLUME ["/data"]
關於 Dockerfile
編寫有如下幾點須要注意:
儘可能不要省略 MAINTAINER
信息。
EXPOSE
的端口不使用公有端口。
CMD
與 ENTRYPOINT
命令使用數組語法。
另外,在國內使用 docker
(以 ubuntu 爲例), Dockerfile
第一個執行的命令最好爲(具體緣由你猜):
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list \ && apt-get update --fix-missing \ && apt-get -y upgrade
Docker Container
中包含了咱們的應用代碼和代碼執行的環境,是用來打包分發代碼的單元。
首先要編寫 Dockerfile
,在文件中寫入構建鏡像須要的指令集,而後執行下面命令:
docker build {image_name} {/path/to/Dockerfile}
例如,咱們構建一個 mysql
的鏡像,先編寫 Dockerfile
FROM ubuntu:14.04 MAINTAINER Tairy <tairyguo@gmail.com> # Install Base. RUN \ sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \ apt-get update && \ apt-get -y upgrade && \ apt-get install -y build-essential && \ apt-get install -y software-properties-common && \ apt-get install -y byobu curl git htop man unzip vim wget RUN apt-get -y install mysql-server EXPOSE 3306 CMD ["mysqld"]
執行
docker build -t mysql ./
構建工具將先在本地查找 ubuntu:14.04
的鏡像,若是有,則直接依賴使用,若是沒有,將去遠程的倉庫中下載官方構建的 ubuntu:14.04
的鏡像,固然由於一些不可描述的緣由,這個下載過程成功率不大,並且很是耗時,因此咱們能夠作以下優化:
docker pull daocloud.io/library/ubuntu:wily-20160706
而後將 Dockerfile
中 FROM
命令修改成:
# 我註冊了daocloud 帳號,就使用 daocloud 的鏡像,也能夠選擇使用阿里雲的鏡像。 FROM daocloud.io/library/ubuntu:wily-20160706
這樣,就節省了不少的時間。
總之,在安裝環境的過程當中,由於某個偉大的防火牆工程,咱們須要的大部分資源都無法順利的獲取到,解決辦法就是將下載的源換成國內某些廠商提供的鏡像源。(推薦阿里雲,畢竟有錢,穩定。)
通過一段時間的自動構建,即可生成一個可用的 mysql
鏡像,使用 docker images
命令查看構建好的鏡像列表,輸出:
REPOSITORY TAG IMAGE ID CREATED SIZE mysql latest ffe5a4341fee 1 days ago 1.009 GB
刪除一個鏡像,使用下面命令:
# -f 表示強制刪除,慎重使用 docker rmi -f image_name
有了基礎的鏡像模板以後,就能夠建立容器來執行應用代碼,具體用到 run
命令:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
例如咱們要建立一個運行 mysql 的容器,能夠執行
docker run -d --name db1 -v `pwd`:/data:rw -p 8001:3306 mysql
這條命令將建立後臺執行的 mysql 容器,裏面運行一個 mysql 服務器,可使用 docker ps
命令查看啓動的容器。
-d 參數表示後臺守護進程運行容器。
--name 參數表示容器的名稱,可隨意取。
-v 表示主機和容器共享文件的映射,容器的目錄就是 Dockerfile 中用 VOLUME 命令定義的目錄。
-p 表器主機和容器端口映射,容器的端口就是 Dockerfile 中用 EXPOSE 命令綁定的端口。
關於建立容器的時候的坑:
通常來講,咱們會在
Dockerfile
中的最後用 CMD 命令定義容器啓動以後執行的命令,可是若是咱們定義的命令執行報錯或者命令沒有建立一個守護進程的話,docker ps
以後是看不到容器在運行的,此時可使用docker l ogs
命令查看容器啓動的日誌,進行排錯。
固然,咱們也能夠在 run 的時候定義容器啓動的命令,例以下面命令將啓動一個 ubuntu 的容器,並執行 /bin/bash
程序,進入 ubuntu 的 terminal:
docker run -it ubuntu:14.04 /bin/bash
此命令成功的標誌就是你會發現命令行變成了相似:
root@d71ff8587917:/#
說明如今已經進入了 ubuntu
的容器中,能夠直接在此命令行中操做 ubuntu
,或者輸入 exit
回車以後便可退出,退出以後再 docker ps
會發現容器也再也不運行了。
一些經常使用命令:
docker ps -a
命令能夠列出全部的容器,包括已經終止運行的。
docker rm container_name/container_id
能夠刪除某個容器。
docker start container_name/container_id
啓動某個容器。
docker stop container_name/container_id
終止某個容器。
docker exec -it contaner_name /bin/bash
在容器中執行 /bin/bash
,執行該命令以後將能夠以交互命令行的方式操做容器,另外 /bin/bash
能夠替換成任意可執行命令。
docker-compose
是用來建立和管理多容器應用的工具,使用 docker-compose
只需三步:
編寫應用運行環境的 Dockerfile
,即 image。
編寫 docker-compose.yml
,在 services
塊下指定容器相關參數以及與其它容器的依賴關係。
執行 docker-compose up
,運行應用。
一個簡單的 docker-compose.yml
以下:
version: '2' # compose 版本,當前爲 2 services: web: # web 容器 build: . # Dockerfile 所在路徑 ports: - "5000:5000" # 端口映射 volumes: - .:/code # 文件路徑映射 - logvolume01:/var/log links: - redis # 連接容器 redis: image: redis # 定義連接容器 volumes: logvolume01: {}