dcoker入門整理

1、Docker簡介

1.1 什麼是Docker

Docker 是 dotCloud 公司開源的一個基於 Linux 內核的 cgroup,namespace,以及 AUFS 類的 Union FS 等技術,對進程進行封裝隔離的高級容器引擎, 其將 Linux 的容器技術發揮極致。Docker 源代碼使用 Go 語言開發,並使用 Apache2.0 協議進行開源,代碼託管在 Github 上。java

Docker 可讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,而後發佈到任何流行的 Linux 機器上。mysql

容器是徹底使用沙箱機制,相互隔離,容器性能開銷極低。linux

Docker 從 17.03 版本以後分爲 CE(Community Edition: 社區版) 和 EE(Enterprise Edition: 企業版)nginx

官網地址:https://www.Docker.comweb

Docker通俗的講,是服務器中高性能的虛擬機,能夠將一臺物理機虛擬N多臺虛擬機的機器,互相之間隔離,互不影響。redis

1.2 爲何須要容器技術

那麼爲何咱們須要使用容器技術?作過開發的同窗確定清楚,咱們在本身電腦開發了一套系統,在本身電腦的環境下是能夠運行的很好,可是一旦這個系統拷貝到其餘系統就能夠出現各類環境問題。正以下圖左邊那樣,咱們在主機上,安裝了各類 App,而這些 App 又依賴各類類庫,有些主機自帶了一些類庫,有些沒有,因此咱們在部署 App 的時候不得不作這些繁雜事情,並且不一樣 App 之間還可能互相影響,這些複雜的環境致使咱們部署 App 會遇到各類各樣莫名其妙的問題,使得咱們開發部署效率極爲低下。spring

Docker 簡介

而有了容器以後,咱們把各類不一樣的 App 運行在不一樣的容器中,這些容器彼此隔離,它們有本身的文件系統,也不能訪問對方的程序,他們的運算和資源都是隔離的。並且咱們能夠把 App 依賴的各類類庫和 App 一同打包到容器中,這樣就使得咱們能夠一次編寫部署處處運行,從而極大提高了開發效率。sql

 

1.3 容器與虛擬機比較

傳統虛擬機技術是虛擬出一套硬件後,在其上運行一個完整操做系統,在該系統上再運行所需應用進程;而容器內的應用進程直接運行於宿主的內核,容器內沒有本身的內核,並且也沒有進行硬件虛擬,所以容器要比傳統虛擬機更爲輕便。docker

Docker 簡介

 

Docker 簡介

 

相同:容器和虛擬機都是虛擬化技術,具有資源隔離和分配優點shell

不一樣:

  • 容器虛擬化的是操做系統,虛擬機虛擬化的是硬件

  • 傳統虛擬機能夠運行不一樣的操做系統,容器主要運行同一類操做系統(Linux)

1.4 Docker 基本概念

 

 

 

宿主機:安裝Docker守護進程的Linux服務器,稱之爲宿主機;

鏡像(Image):Docker 鏡像,就至關因而一個 root 文件系統。好比官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統的 root 文件系統。

容器(Container):鏡像運行以後的實體,鏡像和容器的關係,就像是面向對象程序設計中的類和對象同樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器能夠被建立、啓動、中止、刪除、暫停等。

倉庫(Repository):倉庫可當作一個代碼控制中心,用來保存鏡像。

2、Docker安裝與啓動

安裝以前保證能夠連外網

2.1 安裝

Docker官方建議在Ubuntu中安裝,由於Docker是基於Ubuntu發佈的,並且通常Docker出現的問題Ubuntu是最早更新或者打補丁的。在不少版本的CentOS中是不支持更新最新的一些補丁包的。

因爲咱們學習的環境都使用的是CentOS,所以這裏咱們將Docker安裝到CentOS上。注意:這裏建議安裝在CentOS7.x以上的版本,在CentOS6.x的版本中有Bug!

(1)yum 包更新到最新

sudo yum update

(2)安裝須要的軟件包, yum-util 提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

(3)設置yum源爲阿里雲

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

(4)安裝docker

sudo yum install docker-ce

(5)安裝後查看docker版本

docker -v

2.2 Docker守護進程相關命令

啓動docker:

systemctl start docker

中止docker:

systemctl stop docker

重啓docker:

systemctl restart docker

查看docker狀態:

systemctl status docker

設置開機啓動:

systemctl enable docker

查看docker概要信息

docker info

查看docker幫助文檔

docker --help

2.3 鏡像加速

默認狀況,將從docker hub(https://hub.docker.com/)下載docker鏡像太慢,通常都會配置鏡像加速器;

中國科學技術大學(ustc)是老牌的linux鏡像服務提供者了,還在遙遠的ubuntu 5.04版本的時候就在用。ustc的docker鏡像加速器速度很快。ustc docker mirror的優點之一就是不須要註冊,是真正的公共服務。

https://lug.ustc.edu.cn/wiki/mirrors/help/docker

編輯該文件:

vim /etc/docker/daemon.json  

在該文件中輸入以下內容:

{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

若是中科大鏡像加載速度很慢,建議配置阿里雲鏡像加速,這個鏡像倉庫若是很差使,能夠本身從阿里雲上申請!

{
 "registry-mirrors": ["https://3ad96kxd.mirror.aliyuncs.com"]
}

必需要註冊,每一個人分配一個免費的docker鏡像加速地址,速度極快

配置完成記得刷新配置

sudo systemctl daemon-reload
sudo systemctl restart docker

3、Docker中經常使用命令

3.1 鏡像相關命令

3.1.1 查看鏡像

查看本地全部鏡像

docker images

這些鏡像都是存儲在Docker宿主機的/var/lib/docker目錄下

3.1.2 搜索鏡像

若是你須要從網絡中查找須要的鏡像,能夠經過如下命令搜索;==注意,必須確保當前系統能聯網==

docker search 鏡像名稱

 

 

 

3.1.3 拉取鏡像

拉取鏡像:從Docker倉庫下載鏡像到本地,鏡像名稱格式爲 名稱:版本號,若是版本號不指定則是最新的版本。若是不知道鏡像版本,能夠去docker hub 搜索對應鏡像查看。

docker pull 鏡像名稱

例如,我要下載centos7鏡像

docker pull centos:7

3.1.4 刪除鏡像

按鏡像ID刪除鏡像

docker rmi 鏡像ID

刪除全部鏡像

docker rmi `docker images -q`

3.2 容器相關命令

3.2.1 查看容器

查看正在運行的容器

docker ps

查看全部容器

docker ps –a

查看最後一次運行的容器

docker ps –l

查看中止的容器

docker ps -f status=exited

3.2.2 建立與啓動容器

建立容器命令:

docker run 參數 鏡像名稱:鏡像標籤 /bin/bash

建立容器經常使用的參數說明:

## 命令參數詳解
-i:表示運行容器

-t:表示容器啓動後會進入其命令行。加入這兩個參數後,容器建立就能登陸進去。即分配一個僞終端(若是隻加it兩個參數,建立後就會自動進去容器)。

-d:在run後面加上-d參數,則會建立一個守護式容器在後臺運行(這樣建立容器後不會自動登陸容器)。

--name :爲建立的容器命名。

-v:表示目錄映射關係(前者是宿主機目錄,後者是映射到宿主機上的目錄),可使用多個-v作多個目錄或文件映射。注意:最好作目錄映射,在宿主機上作修改,而後共享到容器上。

-p:表示端口映射,前者是宿主機端口,後者是容器內的映射端口。可使用多個-p作多個端口映射

進入容器以後,初始化執行的命令:/bin/bash;可寫可不寫

(1)交互式容器

docker run -it --name=容器名稱 鏡像名稱:標籤 /bin/bash

這時咱們經過ps命令查看,發現能夠看到啓動的容器,狀態爲啓動狀態

 

 

 

退出當前容器

exit

(2)守護式容器:

docker run -di --name=容器名稱 鏡像名稱:標籤 /bin/bash

(3)登陸容器:

docker exec -it 容器名稱 (或者容器ID) /bin/bash

注意:這裏的登錄容器以後執行的腳本/bin/bash必須寫

3.2.3 中止與啓動容器

中止容器:

docker stop 容器名稱(或者容器ID)

啓動容器:

docker start 容器名稱(或者容器ID)

3.2.4 文件拷貝

若是咱們須要將文件拷貝到容器內可使用cp命令

docker cp 須要拷貝的文件或目錄 容器名稱:容器目錄

也能夠將文件從容器內拷貝出來

docker cp 容器名稱:容器目錄 須要拷貝的文件或目錄

3.2.6 查看容器IP地址

咱們能夠經過如下命令查看容器運行的各類數據

docker inspect 容器名稱(容器ID) 

 

 

 

也能夠直接執行下面的命令直接輸出IP地址

docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱(容器ID)

3.2.7 刪除容器

刪除指定的容器,正在運行的容器沒法刪除

docker rm 容器名稱(容器ID)

 

4、Docker數據卷

4.1 數據卷概述

解決的問題:

考慮到容器的隔離性:

Docker 容器刪除以後,在容器中產生的數據還在嗎?

Docker 容器和外部機器能夠直接交換文件嗎?

容器之間的數據交互?

數據卷是宿主機中的一個目錄或文件,當容器目錄和數據卷目錄綁定後,對方的修改會當即同步;一個數據卷能夠被多個容器同時掛載,一個容器也能夠被掛載多個數據卷

數據卷做用

  • 容器數據持久化

  • 外部機器和容器間接通訊

  • 容器之間數據交換

4.2 數據卷配置方式

(1).1個容器掛載1個數據卷

建立啓動容器時,使用 –v 參數 設置數據卷

docker run ... –v 宿主機目錄(文件):容器內目錄(文件) ... 

注意事項:

  1. 目錄必須是絕對路徑

  2. 若是宿主機目錄不存在,會自動建立

  3. 能夠掛載多個數據卷

案例:

docker run -di --name=c1 -v /root/host_data1:/root/c1_data centos:7 /bin/bash

 

 

 

(2).查看容器已掛載的數據卷

咱們能夠經過如下命令,查看容器中掛載的數據卷

docker inspect 容器名稱(容器ID) 

 

 

 

(3).1個容器掛載多個數據卷

咱們能夠經過如下命令,掛載多個數據卷

docker run -di --name=c1 -v /root/host_data1:/root/c1_data1 -v /root/host_data2:/root/c1_data2 centos:7 /bin/bash

(4).多個容器掛載1個數據卷

多個容器掛載1個數據卷,實現數據共享

docker run -di --name=c2  -v /root/host_data_common:/root/c2_data centos:7
docker run -di --name=c3  -v /root/host_data_common:/root/c3_data centos:7

 

 

 

多個容器掛載1個容器(這個容器掛載1個數據卷)

##建立啓動c3數據卷容器,使用 –v 參數 設置數據卷
docker run -it --name=c3 -v /root/host_data_common:/root/c3_data centos:7 /bin/bash
##建立啓動 c1 c2 容器,使用 –-volumes-from 參數 設置數據卷
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash

 

 

 

5、在Docker中部署應用

5.1 MySQL部署

實現步驟:

  1. 搜索MySQL鏡像

  2. 拉取MySQL鏡像

  3. 建立容器、設置端口映射、設置數據卷

  4. 進入容器操做mysql

  5. 使用Navicat鏈接MySQL

實現過程:

  1. 搜索mysql鏡像

docker search mysql
  1. 拉取mysql鏡像

docker pull mysql:5.6
  1. 建立容器,設置端口映射、目錄映射

docker run -di --name=c_mysql -p 3307:3306 -v /root/mysql/logs:/logs -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6
  • 參數說明:

    • -p 3307:3306:將容器的 3306 端口映射到宿主機的 3307 端口。

    • -v /root/mysql/logs:/logs:將主機目錄(/root/mysql)下的 logs 目錄掛載到容器中的 /logs。日誌目錄

    • -v /root/mysql/data:/var/lib/mysql :將主機目錄(/root/mysql)下的data目錄掛載到容器的 /var/lib/mysql 。數據目錄

    • -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用戶的密碼。

  1. 進入容器,操做mysql

docker exec –it c_mysql /bin/bash
  1. 使用Navicat鏈接容器中的mysql

5.2 Tomcat部署

實現步驟:

  1. 搜索Tomcat鏡像

  2. 拉取Tomcat鏡像

  3. 建立容器、設置端口映射、設置數據卷

  4. 向Tomcat中部署服務

  5. 使用外部機器訪問Tomcat,測試部署服務

實現過程:

  1. 搜索tomcat鏡像

docker search tomcat
  1. 拉取tomcat鏡像

docker pull tomcat:8-jdk8
  1. 建立容器,設置端口映射、目錄映射

docker run -id --name=c_tomcat -p 8080:8080 -v /root/tomcat/webapps:/usr/local/tomcat/webapps tomcat:8-jdk8
  • 參數說明:

    • -p 8080:8080:將容器的8080端口映射到主機的8080端口

      -v /root/tomcat/webapps:/usr/local/tomcat/webapps:將主機目錄(/root/tomcat/webapps)掛載到容器的webapps

  1. 向Tomcat中部署服務,使用FinalShell文件上傳

  2. 使用外部機器訪問Tomcat,測試部署服務

5.3 Redis部署

實現步驟:

  1. 搜索Redis鏡像

  2. 拉取Redis鏡像

  3. 建立容器、設置端口映射

  4. 使用外部機器鏈接Redis,測試

實現過程:

  1. 搜索redis鏡像

docker search redis
  1. 拉取redis鏡像

docker pull redis:5.0
  1. 建立容器,設置端口映射

docker run -id --name=c_redis -p 6379:6379 redis:5.0
  1. 使用外部機器鏈接redis,測試

6、製做Docker鏡像

6.1 鏡像原理

Docker 鏡像本質是什麼?

分層的統一文件系統(union file system)

Docker 中一個centos鏡像爲何只有200MB,而一個centos操做系統的iso文件要幾個個G?

Docker 中一個tomcat鏡像爲何有500MB,而一個tomcat安裝包只有70多MB?

 

 

 

 

 

 

 

 

 

 

 

6.2 遷移與備份

一、容器保存爲鏡像

咱們能夠經過如下命令將容器保存爲鏡像

docker commit {正在運行容器名稱} {鏡像名稱}
# 舉例
docker commit c_tomcat mywar_tomcat

二、鏡像備份

咱們能夠經過如下命令將鏡像保存爲tar 文件

docker save -o {鏡像的備份文件} {鏡像名稱}
# 舉例
docker save -o mywar_tomcat.tar mywar_tomcat
# -o :輸出到的文件

三、鏡像恢復與遷移

首先咱們先刪除掉mynginx_img鏡像 而後執行此命令進行恢復

docker load -i {備份的鏡像文件}
# 舉例
docker load -i mywar_tomcat.tar
# -i :指定導入的文件

執行後再次查看鏡像,能夠看到鏡像已經恢復,能夠再次運行測試

docker run -di --name=mytomcat -p 8081:8080 -v /root/tomcat/webapps/:/usr/local/tomcat/webapps mywar_tomcat:latest

6.3 Dockerfile簡介

Dockerfile 是一個文本文件,包含了構建鏡像文件的指令,每一條指令構建一層,基於基礎鏡像,最終構建出一個新的鏡像;

  • 對於開發人員:能夠爲開發團隊提供一個徹底一致的開發環境

  • 對於測試人員:能夠直接拿開發時所構建的鏡像或者經過Dockerfile文件構建一個新的鏡像,直接開始工做

  • 對於運維人員:在部署時,能夠實現應用的無縫移植

關鍵字:

關鍵字 做用 備註
FROM 指定父鏡像 指定dockerfile基於那個image構建
MAINTAINER 做者信息 用來標明這個dockerfile誰寫的
LABEL 標籤 用來標明dockerfile的標籤 可使用Label代替Maintainer 最終都是在docker image基本信息中能夠查看
RUN 執行命令 執行一段命令 默認是/bin/sh 格式: RUN command 或者 RUN ["command" , "param1","param2"]
CMD 容器啓動命令 提供啓動容器時候的默認命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD ["command" , "param1","param2"]
ENTRYPOINT 入口 通常在製做一些執行就關閉的容器中會使用
COPY 複製文件 build的時候複製文件到image中
ADD 添加文件 build的時候添加文件到image中 不只僅侷限於當前build上下文 能夠來源於遠程服務
ENV 環境變量 指定build時候的環境變量 能夠在啓動的容器的時候 經過-e覆蓋 格式ENV name=value
ARG 構建參數 構建參數 只在構建的時候使用的參數 若是有ENV 那麼ENV的相同名字的值始終覆蓋arg的參數
VOLUME 定義外部能夠掛載的數據卷 指定build的image那些目錄能夠啓動的時候掛載到文件系統中 啓動容器的時候使用 -v 綁定 格式 VOLUME ["目錄"]
EXPOSE 暴露端口 定義容器運行的時候監聽的端口 啓動容器的使用-p來綁定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR 工做目錄 指定容器內部的工做目錄 若是沒有建立則自動建立 若是指定/ 使用的是絕對地址 若是不是/開頭那麼是在上一條workdir的路徑的相對路徑
USER 指定執行用戶 指定build或者啓動的時候 用戶 在RUN CMD ENTRYPONT執行的時候的用戶
HEALTHCHECK 健康檢查 指定監測當前容器的健康監測的命令 基本上沒用 由於不少時候 應用自己有健康監測機制
ONBUILD 觸發器 當存在ONBUILD關鍵字的鏡像做爲基礎鏡像的時候 當執行FROM完成以後 會執行 ONBUILD的命令 可是不影響當前鏡像 用處也不怎麼大
STOPSIGNAL 發送信號量到宿主機 該STOPSIGNAL指令設置將發送到容器的系統調用信號以退出。
SHELL 指定執行腳本的shell 指定RUN CMD ENTRYPOINT 執行命令的時候 使用的shell

6.4 將springboot的可執行jar包製做爲docker鏡像

目標:發佈springboot項目到docker容器中

 

注意:構建docker鏡像的是Dockerfile文件,Dockerfile文件與SpringBoot文件必須存放在同一個目錄;

實現步驟:

  1. 在IDEA中編輯Dockerfile文件

    • 定義基礎鏡像

    • 定義做者信息

    • 向鏡像中添加jar包文件

    • 定義當前鏡像啓動容器時,執行命令

  2. 在宿主機中,構建鏡像,用到docker命令

  3. 基於鏡像,啓動容器

  4. 測試

實現過程:

  1. 在IDEA中編輯Dockerfile文件

    • # 定義基礎鏡像
      FROM java:8
      # 定義做者信息
      MAINTAINER jack <jack@163.com>
      # 添加jar包文件到鏡像中
      ADD springboot.jar app.jar
      # 定義當前鏡像啓動容器時,執行命令
      CMD java –jar app.jar
  2. 在宿主機中,構建鏡像

    • docker bulid –f {dockerfile的文件路徑} –t {鏡像名稱:版本} {構建文件所在路徑}
      # 舉例
      docker build -f Dockerfile -t myspringboot:1.0 /home/etluser/kong/
      # -f:指定要使用的Dockerfile路徑;
      # -t:鏡像的名字及標籤,一般 name:tag 或者 name 格式,不設置爲latest
  3. 基於鏡像,啓動容器

    docker run -di --name=myspringboot -p 9000:8080 myspringboot:1.0
  4. 請求測試

相關文章
相關標籤/搜索