Docker 實踐(二):使用教程

docker 即容器mysql

一些概念

Docker Registry

Docker 遠程鏡像倉庫git

  • DockerHubweb

  • DaoCloud / Aliyunredis

Docker Images

Docker Images 是用來建立 docker 容器的只讀模版,其中包含了容器啓動所須要的全部配置信息和運行程序,一次構建以後能夠屢次複用。sql

從結構上來說,Docker Image 是分層次的,如圖所示:docker

這樣就天然出現了父鏡像和基礎鏡像的概念,在圖中,每個上層鏡像都是依賴於下一層的鏡像,因此下層鏡像可稱爲上層鏡像的父鏡像,而最底層的鏡像是沒有父鏡像的,可稱其爲基礎鏡像(Base Image)。shell

實際場景下,通常咱們本身建立的鏡像都會依賴於某個 Linux 操做系統的鏡像,例如 ubuntu,大多數狀況下,咱們可稱其爲基礎鏡像,可是咱們也能夠查看 ubuntu 鏡像的 Dockerfile 會發現,它也是依賴於一個叫 scratch 的鏡像,scratchdocker 的一個空鏡像,裏面只有 docker 加入的一些元數據,若是咱們想要追求本身的鏡像儘量的輕量,也能夠將 scratch 鏡像做爲咱們的基礎鏡像來構建。ubuntu

Dockerfile

Dockerfile 是用來講明如何自動構建 docker image 的指令集文件,在 Dockerfile 中編寫好指令集以後,咱們就能夠經過 docker build 命令構建鏡像,Dockerfile 文件中命令的順序就是構建過程當中執行的順序。vim

如下爲幾個經常使用的指令:數組

1. FROM:依賴鏡像

全部 Dockerfile 都必須以 FROM 命令開始,表示其依賴的鏡像。

FROM image_name
2. MAINTAINER:鏡像做者信息
MAINTAINER author <author_email>
3. RUN:在shell或者exec的環境下執行的命令
RUN <command>
4. ADD:將主機文件複製到容器中
ADD /path/to/sourcefile/in/host /path/to/targetfile/in/container
5. CMD:指定容器啓動默認執行的命令
CMD ["executable","param1","param2"]
6. EXPOSE:指定容器在運行時監聽的端口
EXPOSE <port>
7. WORKDIR:指定RUNCMDENTRYPOINT 命令的工做目錄
WORKDIR /path/to/workdir/in/container
8. VOLUME:受權訪問從容器內到主機上的目錄
VOLUME ["/data"]

關於 Dockerfile 編寫有如下幾點須要注意:

  • 儘可能不要省略 MAINTAINER 信息。

  • EXPOSE 的端口不使用公有端口。

  • CMDENTRYPOINT 命令使用數組語法。

另外,在國內使用 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

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

而後將 DockerfileFROM 命令修改成:

# 我註冊了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 是用來建立和管理多容器應用的工具,使用 docker-compose 只需三步:

  1. 編寫應用運行環境的 Dockerfile,即 image。

  2. 編寫 docker-compose.yml,在 services 塊下指定容器相關參數以及與其它容器的依賴關係。

  3. 執行 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: {}
相關文章
相關標籤/搜索