一文學會Docker使用

首發(fā)地址:我的博客

image

前言

Docker我以前學過,但是太久沒用,忘得差不多了。。。這幾天準備把寫好的Django應用通過Docker部署到服務器,所以重新復習了Docker,于是寫了此文,希望對想使用Docker的你有所幫助。

初識Docker

Docker 是一個開源的應用容器引擎,Docker 可以讓開發(fā)者打包他們的應用以及依賴包到一個可移植的容器中,然后發(fā)布到任何流行的 Linux 機器上,也可以實現(xiàn)虛擬化。

Docker 的整個生命周期由三部分組成:鏡像(image)+ 容器(container)+ 倉庫(repository)

鏡像是一個只讀的模板,它包括了運行容器所需的數(shù)據(jù)。鏡像可以包含一個完整的 Linux 操作環(huán)境,里面僅安裝了 Python 或者其他用戶需要的程序。

容器是由鏡像創(chuàng)建出來的實例,類似虛擬機,里面可以運行特定的應用,并且容器與容器是相互隔離的。

倉庫概念與 Git 和 Github 類似,如果你用過它們就非常容易理解。Docker 使用的默認倉庫是由官方維護的 Docker hub 公共倉庫,從中上傳、拉取的操作類似 Git。

安裝Docker

$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun

檢驗Docker是否安裝成功

$ docker run hello-world

Unable to find image 'hello-world:latest' locally
......
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
......
Hello from Docker!
This message shows that your installation appears to be working correctly.
......

官方文檔

Docker命令

查看本地已有鏡像

$ docker images

REPOSITORY      TAG        IMAGE ID           CREATED           SIZE
hello-world     latest     fce289e99eb9       9 months ago      1.84kB

# 鏡像名           版本        ID 號             創(chuàng)建時間           大小

查看本地已有的容器

$ docker ps -a

刪除鏡像

$ docker rmi [images ID]  

刪除容器

$ docker container rm [container ID]  

停止容器

$ docker container stop [container ID] 

啟動容器

$ docker container start [container ID]  

Dockerfile

Docker 允許通過文本格式的配置文件來構建鏡像,默認名稱為 Dockerfile

Dockerfile 的組成部分

部分 命令
基礎鏡像信息 FROM
維護者信息 MAINTAINER
鏡像操作指令 RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等
容器啟動時執(zhí)行指令 CMD、ENTRYPOINT

FROM:指定基礎鏡像

FROM <image>                       # 指定基礎鏡像

FROM <image>:<tag>                 # 指定一個tag版本的基礎鏡像

例如:FROM ubuntu:18.04

MAINTAINER:聲明作者

MAINTAINER [name] [email]

例如 MAINTAINER jwt "jianwentaook@163.com"

RUN:執(zhí)行命令

RUN <command> 
# shell模式,以#/bin/sh -c command 形式執(zhí)行, 如RUN echo hello                                                                                 
RUN ["executable", "param1", "param2" ... ] 
# exec模式,指定其他形式的shell來運行指令 ,如RUN ["/bin/bash" ,“-c”,“echo  hello" ]

例如:RUN apt-get update && mkdir /code  

COPY:復制文件\目錄

COPY <src> <dest>

例如:COPY index.html /test/

ADD:高級復制文件

ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]

例如:ADD index.html /var/www/html
例如:ADD /var/share/1.txt /var/www/html

ENV:設置環(huán)境變量

ENV <key> <value>
ENV <key>=<value> ...

例如:ENV JAVA_HOME /usr/local/jdk1.8.0_45
例如:ENV PYTHONUNBUFFERED 1

VOLUME:定義匿名卷

VOLUME ["/data"]

例如:VOLUME /myvol
例如:VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]

EXPOSE:暴露端口

EXPOSE <port> [<port>/<protocol>...]

例如:EXPOSE 80 443
例如:EXPOSE 80/tcp

WORKDIR:指定工作目錄

WORKDIR /path

例如:WORKDIR /data

USER:指定當前用戶

USER <user>[:<group>]
USER <UID>[:<GID>]

例如:USER jwt

CMD:容器啟動命令

CMD ["executable","param1","param2"] 
CMD ["param1","param2"] 
CMD command param1 param2 

例如:CMD ["/usr/bin/wc","--help"]
例如:CMD echo "This is a test." | wc -

ENTRYPOINT:入口點

ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

例如:ENTRYPOINT ["top", "-b"]
例如:ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

實例

# 從倉庫拉取 帶有 python 3.7 的 Linux 環(huán)境
FROM python:3.7

# 設置 python 環(huán)境變量
ENV PYTHONUNBUFFERED 1

# 創(chuàng)建 code 文件夾并將其設置為工作目錄
RUN mkdir /code
WORKDIR /code
# 更新 pip
RUN pip install pip -U
# 將 requirements.txt 復制到容器的 code 目錄
ADD requirements.txt /code/
# 安裝庫
RUN pip install -r requirements.txt
# 將當前目錄復制到容器的 code 目錄
ADD . /code/

Docker compose

在線上環(huán)境中,通常不會將項目的所有組件放到同一個容器中;更好的做法是把每個獨立的功能裝進單獨的容器,這樣方便復用。比如將 Django 代碼放到容器A,將 Mysql 數(shù)據(jù)庫放到容器B,以此類推。

因此同一個服務器上有可能會運行著多個容器,如果每次都靠一條條指令去啟動,未免也太繁瑣了。 Docker-compose 就是解決這個問題的,它用來編排多個容器,將啟動容器的命令統(tǒng)一寫到 docker-compose.yml 文件中,以后每次啟動這一組容器時,只需要 docker-compose up 就可以了。

Ubantu安裝Docker compose

官方文檔 | 查看最新版本

根據(jù)新版本的變化自行調(diào)整下面命令中的版本來安裝:

# 下載docker-compose
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 給docker-compose執(zhí)行權限
$ chmod +x /usr/local/bin/docker-compose

# 查看docker compose版本,測試是否安裝成功
$ docker-compose  version
docker-compose version 1.25.5, build 8a1c60f6

Docker compose

在線上環(huán)境中,通常不會將項目的所有組件放到同一個容器中;更好的做法是把每個獨立的功能裝進單獨的容器,這樣方便復用。比如將 Django 代碼放到容器A,將 Mysql 數(shù)據(jù)庫放到容器B,以此類推。

因此同一個服務器上有可能會運行著多個容器,如果每次都靠一條條指令去啟動,未免也太繁瑣了。 Docker-compose 就是解決這個問題的,它用來編排多個容器,將啟動容器的命令統(tǒng)一寫到 docker-compose.yml 文件中,以后每次啟動這一組容器時,只需要 docker-compose up 就可以了。

Ubantu安裝Docker compose

官方文檔 | 查看最新版本

根據(jù)新版本的變化自行調(diào)整下面命令中的版本來安裝:

# 下載docker-compose
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 給docker-compose執(zhí)行權限
$ chmod +x /usr/local/bin/docker-compose

# 查看docker compose版本,測試是否安裝成功
$ docker-compose  version
docker-compose version 1.25.5, build 8a1c60f6

Docker compose命令

啟動容器服務

$ docker-compose up

#Ctrl + C 即可停止開發(fā)服務器運行

刪除容器

停止服務器后實際上容器還存在,只是停止運行了而已,輸入下面命令可以刪除容器

$ docker-compose down

后臺運行容器

$ docker-compose up -d

重新構建鏡像

$ docker-compose build

啟動和停止已有的容器:

$ docker-compose start
$ docker-compose stop

查看容器日志

$ docker-compose logs

實例

在項目根目錄創(chuàng)建 docker-compose.yml 并寫入:

version: "3"
services:
  app:
    restart: always
    build: .  # '點'代表當前目錄
    command: "python3 manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/code
    ports:
      - "8000:8000"

讓我們來分解一下其中的各項含義。

version 代表 docker-compose.yml 的版本,目前最新版為 3,不需要改動它。

接著定義了一個名叫 app 的容器。后面的內(nèi)容都是 app 容器的相關配置:

  • restart :除正常工作外,容器會在任何時候重啟,比如遭遇 bug、進程崩潰、docker 重啟等情況。
  • build :指定一個包含 Dockerfile 的路徑,并通過此 Dockerfile 來構建容器鏡像。注意那個 "." ,代表當前目錄。
  • command :容器運行時需要執(zhí)行的命令。這里就是我們很熟悉的運行開發(fā)服務器了。
  • volumes卷,這是個很重要的概念。前面說過容器是和宿主機完全隔離的,但是有些時候又需要將其連通;比如我們開發(fā)的 Django 項目代碼常常會更新,并且更新時還依賴如 Git 之類的程序,在容器里操作就顯得不太方便。所以就有,它定義了宿主機和容器之間的映射:"." 表示宿主機的當前目錄,":" 為分隔符,"/code" 表示容器中的目錄。即宿主機當前目錄和容器的 /code 目錄是連通的,宿主機當前目錄的 Django 代碼更新時,容器中的 /code 目錄中的代碼也相應的更新了。這有點兒像是在容器上打了一個洞,某種程度上也是實用性隔離性的一種妥協(xié)。

嚴格意義上講,這里用到的 .:/code 并不是,而是叫掛載,它兩是有區(qū)別的,只不過 docker-compose 允許將掛載寫到卷的配置中。后面章節(jié)會講到。

  • ports :定義了宿主機和容器的端口映射。容器的隔離不止環(huán)境,甚至連端口都隔離起來了。但 web 應用不通過端口跟外界通信當然不行,因此這里定義將宿主機的 8000 端口映射到容器的 8000 端口,即訪問宿主機的 8000 端口就是訪問到了容器的 8000 端口,但要確保端口沒有被其他程序占用。

Docker 可視化

Portainer是Docker的圖形化管理工具,提供狀態(tài)顯示面板、應用模板快速部署、容器鏡像網(wǎng)絡數(shù)據(jù)卷的基本操作(包括上傳下載鏡像,創(chuàng)建容器等操作)、事件日志顯示、容器控制臺操作、Swarm集群和服務等集中管理和操作、登錄用戶管理和控制等功能。功能十分全面,基本能滿足中小型單位對容器管理的全部需求。

項目地址:https://github.com/portainer/portainer

官方文檔:https://www.portainer.io/documentation/

安裝

# 拉取鏡像
docker pull portainer/portainer

# 一鍵部署
docker volume create portainer_data
docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

使用

瀏覽器訪問9000端口即可進入到Portainer界面,首次打開需要設置密碼

若無法訪問,請到云服務器控制臺,開啟9000端口

image

單機版本選擇Local,點擊Connect即可連接到本地docker

image

登錄后我們可以查看服務器上各個鏡像、容器、網(wǎng)絡、Volume 等信息,并可以對它們進行管理。

image

image

在頁面上就可以直接進行容器的創(chuàng)建、啟動、停止、刪除等操作

image

可查看容器詳細信息,還可查看 log 日志,甚至進入容器執(zhí)行命令。

image

創(chuàng)建一個容器

Containers 頁面中,點擊右上角的“Add container” 按鈕。

接著填寫好容器名、鏡像名、端口映射等相關信息后,點擊下方的“Deploy the container” 后便會開始自動拉取鏡像啟動容器。

參考:Portainer - Docker的可視化管理工具使用詳解

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容