Docker:CentOS7中安裝與使用Docker

Docker的安裝與啓動

Docker可以運行在MAC、Windows、CentOS、DEBIAN、UBUNTU等操作系統上,提供社區版和企業版 。

  • 安裝在windows系統時,要求windows系統是win10專業版;
  • 安裝在Linux系統中時,要求Linux是64位的。如果使用CentOS系統,建議使用CentOS7(因爲Docker對CentOS7的支持不太好)

下面,在CentOS7.6-64Bit系統下安裝Docker。

(這裏用的騰訊雲服務器!)

目標:在線安裝docker,並使用命令啓動、停止docker

實現步驟

  1. 修改yum源爲ustc; 使用其他廠商的鏡像服務器也可以,常用的如Aliyun
  2. 安裝docker;
  3. 修改docker的鏡像源爲ustc;
  4. 使用docker命令操作docker

這是在線安裝,需要聯網纔行,而且網速要好(下載速度不低於1M/s)。

安裝Docker

以下在root用戶下執行。

# 1、yum 包更新到最新
yum update

# 2、作用:安裝需要的軟件包, yum-util 提供yum-config-manager功能,另外兩個是devicemapper驅動依
賴的
yum install -y yum-utils device-mapper-persistent-data lvm2

# 3、 設置yum源(以下2選1即可)
# 3.1、方案一:使用ustc的(推薦)		這個網站的連接不需要翻牆
yum-config-manager --add-repo http://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 3.2、方案二:使用阿里雲(可能失敗)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 4、 安裝docker;出現輸入的界面都按 y
yum install -y docker-ce

# 5、 查看docker版本
docker -v

設置鏡像源

ustc是老牌的linux鏡像服務提供者了,還在遙遠的ubuntu 5.04版本的時候就在用。ustc的docker鏡像加速器速度很快。ustc docker mirror的優勢之一就是不需要註冊,是真正的公共服務。

國內比較好用的幾個鏡像源 :

Docker 官方中國區:https://registry.docker-cn.com
網易:http://hub-mirror.c.163.com
中國科技大學:https://docker.mirrors.ustc.edu.cn
阿里雲:https://y0qd3iq.mirror.aliyuncs.com

需要給Linux系統添加一個配置文件:/etc/docker/daemon.json

# 新建目錄及文件
$ mkdir /etc/docker # 創建目錄
$ vim /etc/docker/daemon.json # 創建docker的配置文件
# 如果系統剛安裝時,沒有vim工具,可以使用vi指令。或者安裝vim
$ sudo yum install vim

# 在daemon.json文件中添加如下內容
{ 
	"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

# 重啓docker服務(docker內運行的所有容器都會停止,這就相當於windwos系統重啓,應用程序都會被關閉。)
$ sudo systemctl restart docker

# 驗證鏡像源配置是否成功
$ docker info|grep Mirrors -A 1	# 會看到配置鏡像源信息

如果使用ustc鏡像源下載鏡像比較慢的話,可以考慮換成阿里雲的。

Docker的啓動與停止

# 啓動docker服務:
systemctl start docker

# 啓動docker服務(docker的守護進程)後,運行docker的hello-world程序,來驗證是否成功安裝並啓動
docker run hello-world

# 停止docker服務:
systemctl stop docker

# 重啓docker服務:
systemctl restart docker

# 查看docker服務狀態:
systemctl status docker

# 設置開機啓動docker服務:
systemctl enable docker

1. Docker常用命令

這是docker本身的指令,跟Linux系統的版本就沒有關係了!

  • **從這開始,均使用的是guest用戶進行的操作。 $符號開關,表示當前用戶是非root用戶。

先修改一下/etc/sudoers文件的配置內容,給guset賦予能夠執行一切指令的權限:

1568293291412

1.1 一些通用命令

# 獲取有關Docker版本的信息
$ docker -v

# 獲取所有可用Docker命令的列表
$ docker

1.2 鏡像相關命令

查看鏡像

# 查看當前系統可用的鏡像
$ docker images

搜索鏡像 + 拉取鏡像

# 在線搜索鏡像
$ docker search 鏡像名稱
$ docker search centos

# 拉取鏡像
# 就是從Docker倉庫下載鏡像到本地,鏡像名稱格式爲 “名稱:版本號”,如果版本號不指定則是最新的版本
$ docker pull centos:7

刪除鏡像

要求所刪除的鏡像不能被任何的容器正在使用,否則需要先刪除容器,再刪除鏡像。

# 查看當前宿主機可用的鏡像
$ sudo docker images	# 普通用戶只用docker images指令是沒權限查看鏡像列表的

# 刪除鏡像
$ sudo docker rmi centos	# 使用名稱刪除鏡像
$ sudo docker rmi 鏡像id	   # 按照鏡像id刪除鏡像

# 刪除所有鏡像
$ sudo docker rmi `docker images -q`	# 反單引

1.3 容器相關命令

容器,也是docker中的核心概念,容器是由鏡像運行產生的運行實例。鏡像和容器的關係,就如同Java語言中類和對象的關係。 (鏡像是類,容器就是對象)

Docker提供的關於容器的操作有:

  • 查看容器
  • 創建容器
  • 啓動容器
  • 停止容器
  • 文件拷貝
  • 目錄掛載
  • 查看容器ip地址
  • 刪除容器

查看容器

# 查看正在運行過的容器
$ sudo docker ps
#查看所有容器
$ sudo docker ps -a

創建容器

可以基於已有的鏡像來創建和啓動容器,創建與啓動容器使用命令:

語法格式:$ sudo docker run [參數列表] 使用的鏡像名稱或ID /bin/bash

參數說明:

-i:表示運行容器

-t:表示容器啓動後會進入其命令行。加入這兩個參數後,容器創建就能登錄進去。即分配一個僞終端。

–name :爲創建的容器命名。

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

-d:在run後面加上-d參數,則會創建一個守護式容器在後臺運行(這樣創建容器後不會自動登錄容器,如果只加-i -t 兩個參數,創建後就會自動進去容器)。

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

交互式容器

什麼是交互式容器?啓動容器之後會直接進入容器的命令行終端,如果退出容器,則容器停止運行。

命令行終端進入容器中時,使用exit命令退出容器。

# 先查詢當前主機中可用的鏡像
$ sudo docker images

# 拉取一個鏡像;這一步不是每次啓動容器都要做的,如果主機中已有此鏡像,就無需再拉取了
$ sudo docker pull centos

# 創建並啓動名稱爲 mycentos7_inter 的交互式容器;下面指令中的鏡像名稱 centos 也可以使用鏡像id
# /bin/bash  表示進入容器後,shell腳本(指令)使用的解析器
$ sudo docker run -it --name=mycentos7_inter centos /bin/bash

參數說明:

-i:表示運行容器

-t:表示容器啓動後會進入其命令行。加入這兩個參數後,容器創建就能登錄進去。即分配一個僞終端。

–name :爲創建的容器命名。

創建容器成功後就直接進入了容器,Linux指令中顯示的用戶標識也跟着變了

[root@030d34106602 /]# 一進入容器,默認是擁有的root用戶權限

想要退出當前容器,執行exit指令。

是否創建成功,可以通過$ docker ps$ docker ps -a查看容器。

守護式容器

對於一個需要長期運行的容器來說,我們可以創建一個守護式容器。(docker本身就有一個守護進程,也就是可以在後臺運行的進程,它的作用就是保持docker程序處於運行之中。)

命令如下(同一主機中的容器間名稱不能重複):

# 創建並啓動守護式容器
$ sudo docker run -di --name=mycentos7_daemon centos

# 登錄進入容器,命令爲:(exit退出時,守護式容器不會停止)
$ sudo docker exec -it container_name (或者 container_id) /bin/bash
$ sudo docker exec -it mycentos7_daemon /bin/bash

參數說明:

-i:表示運行容器

-t:表示容器啓動後會進入其命令行。加入這兩個參數後,容器創建就能登錄進去。即分配一個僞終端。

–name :爲創建的容器命名。

-d:分離模式,在後臺運行命令。在run後面加上-d參數,則會創建一個守護式容器在後臺運行(這樣創建容器後不會自動登錄容器,如果只加-i -t 兩個參數,創建後就會自動進去容器)。

然後登錄進容器

再使用exit指令退出守護式容器,再用docker ps查看正在運行的容器,可以看到上面啓動的守護式容器,還在運行中。

那麼問題來了? 我要怎麼退出一個守護式容器呢??–>看下面“停止容器”

停止與啓動容器

要回到宿主機中來執行docker命令(容器中是沒有安裝docker的)

# 停止正在運行的容器:docker stop 容器名稱或者ID
$ sudo docker stop mycentos7_daemon

# 停止守護式容器後,再查看正在運行的容器中,看看守護式容器有沒有被停止
$ sudo docker ps

# 啓動已運行過的容器(QQQQ: 沒有運行的過的容器,能否用這種方式啓動?):docker start 容器名稱或者ID
$ sudo docker start mycentos7_daemon

文件拷貝

  • 將linux宿主機中的文件拷貝到容器中

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

# 在主機根目錄下,創建一個文件abc.txt
$ sudo touch a.txt

# 在主機目錄下,執行指令。
# 複製a.txt到 mycentos7_daemon 容器的 / 目錄下		要保證容器已啓動
$ sudo docker cp a.txt mycentos7_daemon:/

# 進入 mycentos7_daemon 容器
$ sudo docker exec -it mycentos7_daemon /bin/bash

# 查看容器 / 目錄下文件
$ sudo ll

參數說明:

-i:表示運行容器

-t:表示容器啓動後會進入其命令行。加入這兩個參數後,容器創建就能登錄進去。即分配一個僞終端。

  • 將文件從容器內拷貝出來到linux宿主機中
    語法:docker cp 容器名稱:容器目錄 需要拷貝的文件或目錄
# 進入容器後,如果沒有什麼文件,就創建一個,如文件c.txt
$ sudo touch c.txt

# 退出容器
$ sudo exit

# 在Linux宿主機器執行復制
# 將容器 mycentos7_daemon 中根目錄/下的c.txt文件複製到Linux宿主機器的/root目錄下
$ sudo docker cp mycentos7_daemon:/c.txt /root

注意:容器在停止狀態下,也可以完成文件的拷貝。

目錄掛載

可以在創建容器的時候,將宿主機的目錄與容器內的目錄進行映射,這樣我們就可以通過修改宿主機某個目錄的文件 從而去影響容器。

創建容器時添加-v參數,後邊爲宿主機目錄:容器目錄

例如: sudo docker run -di -v /usr/local/test:/usr/local/test --name=mycentos3 centos:7

QQQQ:如果我現在已有容器了,想要來建立一個掛載目錄,怎麼辦呢?

創建容器時,建立掛載目錄:

# 創建linux宿主機器要掛載的目錄
$ sudo mkdir /usr/local/test

# 創建並啓動容器 mycentos3,並掛載linux中的/usr/local/test目錄到容器的/usr/local/test目錄
# 後面,在linux中的/usr/local/test中操作,相當於對容器相應目錄操作
# 創建一個守護式容器
$ sudo docker run -di -v /usr/local/test:/usr/local/test --name=mycentos3 centos:7

# 在linux宿主機下,創建文件
$ sudo touch /usr/local/test/def.txt

# 進入容器
$ sudo docker exec -it mycentos3 /bin/bash

# 在容器中,查看目錄中是否有對應文件def.txt
$ sudo ll /usr/local/test

參數說明:

-i:表示運行容器

-t:表示容器啓動後會進入其命令行。加入這兩個參數後,容器創建就能登錄進去。即分配一個僞終端。

–name :爲創建的容器命名。

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

-d:在run後面加上-d參數,則會創建一個守護式容器在後臺運行(這樣創建容器後不會自動登錄容器,如果只加-i -t 兩個參數,創建後就會自動進去容器)。

另外,還要注意:

如果你共享的是多級目錄,可能會出現權限不足的提示。 這是因爲CentOS7中的安全模塊selinux把權限禁掉了,需要添加參數 --privileged=true 來解決掛載的目錄沒有權限的問題。

查看容器ip

語法:docker inspect 容器名稱(容器ID)

# 在linux宿主機下查看容器的ip
$ sudo docker inspect mycentos7_daemon

注意:

容器之間在一個局域網內,linux宿主機器可以與容器進行通信;但是外部的物理機筆記本是不能與容器直接通信的,如果需要則要通過宿主機器端口的代理。

刪除容器

分爲刪除指定容器,與刪除所有容器

語法:

​ 刪除指定窗口:docker rm 容器名稱(容器ID)

# 刪除指定容器
$ sudo docker rm mycentos_daemon

# 刪除所有容器
$ sudo docker rm `docker ps -a -q`	# 反單引

如果容器是運行狀態,則會刪除失敗,需要停止容器才能刪除。

2. Docker容器部署應用

在Docker容器中部署應用程序,就相當於是安裝軟件。

以安裝如下應用程序爲例:

  • MySQL
  • Tomcat
  • Redis
  • Nginx

2.1 MySQL容器部署

查看與搜索鏡像

查看一下當前Linux主機中有哪些鏡像及容器:

# 查看鏡像
$ sudo docker images

# 查看容器
$ sudo docker ps -a  # 查看全部容器

# 搜索一下mysql有哪些鏡像
$ sudo docker search mysql

拉取鏡像

# Linux宿主機中操作:拉取MySQL的鏡像,如果有了就不需要再拉取了
$ sudo docker pull centos/mysql-57-centos7

創建容器

# Linux宿主機中操作:使用鏡像創建mysql守護式容器,並進行端口映射,同時配置環境變量
$ sudo docker run -di --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql

參數說明:

-d:在run後面加上-d參數,則會創建一個守護式容器在後臺運行(這樣創建容器後不會自動登錄容器,如果只加-i -t 兩個參數,就是創建交互式容器了。)。

-i:表示運行容器

–name :爲創建的容器命名。

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

-e 代表添加環境變量 MYSQL_ROOT_PASSWORD 容器中的MySQL的root用戶密碼,作爲root用戶遠程登陸之用

操作容器中的MySQL

# 登錄進容器
$ sudo docker exec -it mysql /bin/bash

# 登錄容器裏面的mysql,登錄後,默認使用的是容器的root用戶
mysql -u root -p		# 在容器中使用root用戶登錄的話,不需要輸入密碼,密碼寫爲空

參數說明:

-i:表示運行容器

-t:表示容器啓動後會進入其命令行。加入這兩個參數後,容器創建就能登錄進去。即分配一個僞終端。

遠程登錄MySQL

# 查看ip
# 如果要內部連接該mysql(指當前Linux宿主機內),比如其他容器要連接mysql容器的mysql的時候,可以使用如下命令查看Ip
$ sudo docker inspect mysql

使用Navicat在windows中進行遠程登錄,連接在docker容器中的MySQL數據庫。

docker容器中的MySQL數據庫的參數:

​ 主機名或地址:虛擬機IP

​ 端口:3306

​ 用戶名:root

​ 密碼:root


使用最新版本的MySQL時,Navicat連接Docker -Mysql會報錯:caching sha_2_password cannot be load。

原因

​ docker上pull的mysql爲最新的,最新的MySQL更換了新的身份驗證插件(caching_sha2_password), 原來的身份驗證插件爲(mysql_native_password) 。

解決方案

​ 登錄進入mysql容器,執行以下mysql指令,然後再用Navicate連接。

alter user 'root'@'%' identified with mysql_native_password by 'root';

地址映射關係圖示

1568128537269

2.2 Tomcat容器部署

安裝並啓動tomcat容器

# 查詢
$ sudo docker search tomcat

# 拉取鏡像
$ sudo docker pull tomcat:7

# 創建並啓動tomcat容器,並掛載webapps目錄
# 要確保虛擬機存在/usr/local/tomcat/webapps目錄,沒有的話要先創建好
$ sudo docker run -di --name=tomcat7 -p 8080:8080 -v /usr/local/tomcat/webapps:/usr/local/tomcat/webapps tomcat:7

# 如果出現 WARNING: IPv4 forwarding is disabled. Networking will not work.
#執行如下操作
# 1、編輯 sysctl.conf
vi /etc/sysctl.conf
# 2、在上述打開的文件後面添加如下配置:打開IPv4 forwarding
net.ipv4.ip_forward=1
# 3、重啓network
systemctl restart network

參數說明:

-i:表示運行容器

–name :爲創建的容器命名。

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

-d:在run後面加上-d參數,則會創建一個守護式容器在後臺運行(這樣創建容器後不會自動登錄容器,如果只加-i -t 兩個參數,創建後就會自動進去容器)。

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

測試tomcat安裝成功與否

​ 本地主機通過瀏覽器訪問虛擬機的8080端口,我的地址爲:http://192.168.178.147:8080

​ 此時,會顯示連接不上,HTTP ERROR 404錯誤,說明是資源找不到。這是正確的,並不是說tomcat沒有安裝沒有啓動。

原因:

​ 宿主機/usr/local/tomcat/webapps下沒有任何資源,故而對應映射到Tomcat容器的webapps目錄中也沒有任何項目資源,所以訪問不到。

# 進入容器tomcat中去查看
# 進入的默認目錄就是 `root@c632fdf96976:/usr/local/tomcat#`
$ sudo docker exec -it mytomcat7 /bin/bash

# 查看容器tomcat的webapps目錄,可見它是空目錄,沒有任何資源

可以往tomcat的/user/local/tomcat/webapps下部署應用,然後再訪問。

比如,往tomcat容器中部署dubbo-admin.war包的項目

​ dubbo-admin默認的賬號密碼:guest/guest

1568132292904



2.3 Redis容器部署

安裝並運行Redis容器

# 查詢redis鏡像
$ sudo docker search redis

# 拉取redis鏡像,如果有3.2版本及以上,最好安裝它們(redis的geo功能,要求它是3.2及其以上版本)
$ sudo docker pull redis:3.2

# 創建並啓動redis容器
$ sudo docker run -di --name=redis3.2 -p 6379:6379 redis

# 進入redis容器
$ sudo docker exec -it redis3.2 /bin/bash	# 默認進入到‘root@5a543e59cf93:/data#’

# 容器中啓動redis客戶端,進行數據操作
$ sudo cd /usr/local		# 進入redis安裝目錄
$ sudo cd /usr/local/bin	# 進入redis安裝程序的bin目錄
$ sudo ./redis-cli			# 啓動redis客戶端

1568133487915

遠程連接Redis

使用Redis Desktop Manager管理工具連接

1568133819652

2.4 Zookeeper容器部署

# 查詢鏡像
$ sudo docker search zookeeper

# 拉取鏡像
$ sudo docker pull zookeeper

# 創建並啓動 zookeeper 容器
$ sudo docker run -di --name=zookeeper -p 2181:2181 zookeeper

# 查看是否成功啓動
$ sudo docker ps # 查看正在運行的容器

2.5 Nginx容器部署

# 查詢鏡像
$ sudo docker search nginx

# 拉取鏡像
$ sudo docker pull nginx

# 創建並啓動 nginx 容器
$ sudo docker run -di --name=nginx -p 80:80 nginx

# 本地主機訪問Nginx容器		http://宿主虛擬機IP/
192.168.178.151	# 80端口可以不寫

3. Docker Compose

Compose項目是Docker官方的開源項目,負責實現對Docker容器集羣的快速編排。

它是一個定義和運行多容器的 docker應用工具。

使用compose,通過配置docker-compose.yml文件同時啓動多個容器。

Docker-Compose將所管理的容器分爲三層,分別是:

  • 工程(project):由一組關聯的應用容器組成的一個完成業務單元,在docker-compose.yml中定義。即是 Compose的一個配置文件可以解析爲一個項目,Compose通過分析指定配置文件,得出配置文件所需完成的所 有容器管理與部署操作。
  • 服務(service):一個應用的容器,實際上可以包括若干運行相同鏡像的容器實例。每個服務都有自己的名 字、使用的鏡像、掛載的數據卷、所屬的網絡、依賴哪些其他服務等等,即以容器爲粒度,用戶需要Compose 所完成的任務。
  • 容器(container):鏡像的運行實例

一個工程當中可包含多個服務;每個服務中定義了容器運行的鏡像,參數,容器間依賴關係,一個服務當中可包括多個容器實例。

Docker-Compose運行目錄下的所有文件(docker-compose.yml,extends文件或環境變量文件等)組成一個工 程,若無特殊指定工程名即爲當前目錄名。

Docker-Compose工程配置文件默認爲docker-compose.yml,可通過環境變量COMPOSE_FILE-f參數自定義配 置文件,其定義了多個有依賴關係的服務及每個服務運行的容器。

還使用一個Dockerfile模板文件,讓用戶很方便地定義一個單獨的應用容器。在工作中,經常會碰到需要多個容器相互配合來完成某項任務的情況。例如:要部署一個Web項目,除了Web服務容器,往往還需要再加上後端的數據庫服務容器,甚至還包括負載均衡容器等。

3.1 docker-compose的安裝與卸載

要求是64-bit Linux,而且還要求其他一些庫的支持。

1568309740795

安裝

Compose目前已經完全支持Linux、Mac OS和Windows。安裝Compose之前,需要先安裝Docker。

下面我們將compose安裝到CentOS7.6-64bit系統中:

(二進制包方式安裝的,卸載時,刪除二進制文件即可)

# 安裝 py-pip
# 檢查linux中有沒有安裝py-pip包,終端執行 pip -V
$ sudo pip -v
# 若沒有安裝,則進行安裝
$ sudo yum -y install epel-release
$ sudo yum -y install python-pip
$ sudo pip install --upgrade pip	# 升級到最新版本

# 安裝docker-compose
$ sudo pip install docker-compose --ignore-installed requests
# curl是通過url語法命令在線上傳或下載文件的工具
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/dockercompose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose	# 設置文件的可執行權限 +x

# 查看版本信息
$ sudo docker-compose -version

1568310052418

卸載

# 二進制包方式安裝的,刪除二進制文件即可
$ sudo rm -rf /usr/local/bin/docker-compose

3.2 docker-compose常用命令

  • 查詢命令幫助信息:docker-compose [command] --help

Compose命令的基本的使用格式爲:

docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]

-f,–file FILE		指定使用的Compose模板文件,默認爲docker-compose.yml,可以多次指定。
-p,–-project-name NAME		指定項目名稱,默認將使用所在目錄名稱作爲項目名。
--verbose			輸出更多調試信息
-v,–-version		打印版本並退出
Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

3.3 docker-compose模板文件

模板文件配置是使用Docker Compose的核心,涉及的指令關鍵字也比較多。

默認的模板文件名稱爲docker-compose.yml,格式爲YAML格式。

比如一個Compose模板文件:

version:"3"	# 指定模板文件版本,也就是指定了應用版本
services:
  nginx1:	# 定義一個服務,取名爲 nginx1
    images: nginx	# 使用nginx鏡像來創建容器
    ports:
      - "80:80"	# 端口映射,宿主機端口:容器端口
    volumes:
      - /usr/local/abc:/usr/local/abc	# 數據卷,即目錄掛載

# volumes:

# networks:

docker-compose.yml模板文件主要分爲3個區域,如下:

  • services 服務

在它下面可以定義應用需要的一些服務,每個服務都有自己的名字、使用的鏡像、掛載的數據卷、所屬的網 絡、依賴哪些其他服務等等。 一個服務中可以有多個容器

  • volumes 數據卷

在它下面可以定義數據卷(名字等等),然後掛載到不同的服務下去使用。

  • networks 應用的網絡

在它下面可以定義應用的名字、使用的網絡類型等等。 這個“應用”,就是一個具體的web應用,相當於docker中的project。

docker-compose.yml文件使用的主要命令

指令 功能
build 指定服務鏡像Dockerfile所在路徑
cap_add, cap_drop 指定容器的內核能力(capacity)分配
command 覆蓋容器啓動後默認執行的命令
cgroup_parent 指定父cgroup組,意味着將基礎該組的資源限制
container_name 指定容器名稱。默認將會使用項目名稱服務名稱序號這樣的格式
devices 指定設置映射關係
dns 自定義DNS服務器。可以是一個值,也可以是一個列表
dns_search 配置DNS搜索域。可以是一個值,也可以是一個列表
dockerfile 指定額外編譯鏡像的Dockerfile文件,可以通過該指令來指定
env_file 從文件中獲取環境變量,可以爲單獨的文件路徑或列表
environment 設置環境變量,可以使用數組或字典兩種格式
expose 暴露端口
external_links 鏈接到docker-compose.yml外部的容器,甚至可以是非Compose管理的外部容器
extra_hosts 指定額外的host名稱映射信息
image 指定爲鏡像名稱或鏡像ID。如果鏡像在本地不存在,Compose將會嘗試拉取這個鏡像
labels 指定服務鏡像Dockerfile所在路徑
links 鏈接到其他服務中的容器
log_driver 指定日誌驅動類型,類似於Docker中的–log-driver參數。目前支持三種日誌驅動類型: log_driver:“json-file”、log_driver:“syslog”、log_driver:“none”
log_opt 日誌驅動的相關參數
net 設置網絡模式。參數類似於docker clinet的–net參數一樣
pid 跟主機系統共享進程命名空間。打開該選項的容器之間,以及容器和宿主機系統之間可以 通過進程ID來相互訪問和操作
ports 暴露端口信息
security_opt 指定容器模板標籤(label)機制的默認屬性(如用戶、角色、類型、級別等)
ulimits 指定容器的ulimits限制值
volumes 數據卷所掛載路徑設置。可以設置宿主機路徑(HOST:CONTAINER)或加上訪問模式 (HOST:CONTAINER:ro)

3.4 Compose應用

  • 需要root用戶去編寫

需求:編寫docker-compose.yml模版文件,實現同時啓動tomcat、mysql和redis容器。

創建docker-compose.yml文件

# 創建文件夾
$ sudo mkdir -p /usr/local/docker-compose
#進入文件夾
$ cd /usr/local/docker-compose
#創建 docker-compose.yml文件;內容如下
$ sudo vi docker-compose.yml

建議使用EditPlus去編寫Linux的配置文件。

編寫docker-compose.yml文件

  • 注意,寫到配置文件中時,所有註釋都給去掉
version: '3'
# 服務配置
services:
  redis1: # 服務名
    image: redis:3.2	# 使用redis鏡像創建容器
    ports:
      - "6379:6379"	# 端口映射,宿主機端口:容器端口
    container_name: "redis1"	# 創建的容器名稱
    networks:	# 定義容器所處的網絡
      - dev
  mysql1:
    image: mysql	# 鏡像未加版本號,就是使用的最新版本
    environment:
      MYSQL_ROOT_PASSWORD: "root"
    ports: 
      - "3306:3306"
    container_name: "mysql1"
    networks: 
      - dev
  tomcat:
    images: tomcat:7
    ports: 
      - "8080:8080"
    container_name: "tomcat1"
    networks: 
      - dev
      - pro
  nginx1:
    image: nginx
    ports:
      - "80:80"
    container_name: "nginx1"
    networks: 
      - pro
      
# 網絡配置
networks:
  dev:	# 開發環境
    driver: bridge
  pro:	# 生產環境
    driver: bridge

以上配置文件中,各容器所有網絡的情況:

1568354249286

運行docker-compose.yml文件,啓動項目

#啓動前最好把docker重啓,不然原來的tomcat/mysql/redis容器也是啓動狀態的話,那麼會因端口衝突而啓動失敗
$ sudo systemctl restart docker
$ cd /usr/local/docker-compose
$ sudo docker-compose up

# 如果想後臺啓動,則使用如下命令
$sudo docker-compose up -d

# 若要停止
$sudo docker-compose stop

查看運行情況:

1568356741302


1568356826434


1568356890475


測試

1568357022706

4. 容器|鏡像的遷移與備份

1568357630153

QQQQ:如何在centos容器中安裝tomcat等應用程序??

​ centos容器中,就得以原生方式安裝應用(上傳應用安裝包,安裝)。

涉及到的命令有:

docker commit 將容器保存爲鏡像

docker save 將鏡像備份爲tar文件

docker load 根據tar文件恢復鏡像

# 將容器保存爲鏡像
$ sudo docker commit 容器名稱 鏡像名稱

# 備份鏡像爲tar文件
$sudo docker save -o 文件名.tar|文件名.tar.gz 鏡像名	# 保存到當前目錄下

# 從tar文件中恢復鏡像
$sudo docker load -i 文件名.tar

注意:同一個主機中,不能有兩個同名的鏡像

5. Dockerfile

什麼是Dockerfile

使用Docker時,想要獲得一個鏡像,可以從Docker倉庫中進行下載,或者使用鏡像備份後的tar文件。還可以自己根據需求製作新的鏡像。

Dockerfile就是用於製作新鏡像的。

Dockerfile其實是一個文本文件,由一系列命令和參數構成,Docker可以讀取Dockerfile文件並根據Dockerfile文件的內容來構建新鏡像。

Dockerfile文件內容一般分爲4部分:

  • 基礎鏡像信息
  • 維護者信息
  • 鏡像操作指令
  • 容器啓動時執行的指令

Dockerfile常用命令

1568359810742

使用Dockerfile製作新鏡像

基於基礎鏡像製作新鏡像,新鏡像中會包含有其他一些應用,如jdk,tomcat等。

示例

以鏡像 centos:7爲基礎鏡像,添加jdk1.8的應用,構建一個包含jdk1.8的centos7新鏡像,取名爲 jdk1.8-centos7

這個取名是有講究的:

​ (取名規則,借鑑Java中類的命名,前面是修飾,最後纔是類的根本,如 MessageListener

​ 分段命名,中劃線分隔。

​ 比如上面這個“jdk1.8-centos7”: 其根本上是一個centos7系統,但是這個系統有包含有jdk1.8。


注意:要添加到基礎鏡像中的jdk1.8應用,是一個jdk1.8的tar包,不是一個jdk1.8容器或鏡像。


# 1、宿主機中創建目錄
$ sudo mkdir -p /usr/local/jdk1.8-centos7
$ cd /usr/local/jdk1.8-centos7

# 2、上傳 jdk-8u221-linux-x64.tar.gz 文件到宿主機的/usr/local/jdk1.8-centos7目錄
# jdk安裝包注意一定要是linux 64位的,oracle官方上下載即可

# 3、在 /usr/local/jdk1.8-centos7 目錄下創建Dockerfile文件
$ sudo vim Dockerfile

# Dockerfile文件內容如下:(環境變量中各個屬性的值,得根據自己用的jdk安裝包版本來寫)
FROM centos:7
MAINTAINER yeats
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk-8u221-linux-x64.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_221
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

# 4、執行命令構建鏡像;不要忘了後面的那個 .
$ sudo docker build -t='jdk1.8-centos7' .	# 最後那個點,表示“當前目錄”,即將構建的新鏡像存放到當前目錄

# 5、查看鏡像是否建立完成
$ sudo docker images

(1)ADD jdk-8u221-linux-x64.tar.gz /usr/local/java/

將jdk安裝到/usr/local下沒什麼說的,Linux中建議用戶安裝的軟件都放到該目錄下。但安裝到java目錄下,這是windows中jdk默認安裝的目錄C:\Program Files\Java\jdk1.8.0_144

(2)ENV JAVA_HOME /usr/local/java/jdk1.8.0_221

怎麼知道jdk壓縮包解壓後的目錄是jdk1.8.0_221的?去解壓一下看看就可以了

1568364881016

(3)WORKDIR /usr

WORKDIR 工作目錄。 指一進入容器,默認進入到的目錄。

執行構建命令,會根據Dokcerfile文件的內容,一行一行執行(一行命令就是一個執行步驟):

  • 注意,下面圖中原來使用的jdk壓縮包是linux-32bit的,製作新鏡像,創建容器都能成功,但是最後進入jdk1.8-centos7容器中查看jdk版本時,java -version命令是執行不了的,會報錯。

1568361439380


使用新鏡像創建容器,並測試

使用上面製作的新鏡像jdk1.8-centos7,創建容器

基礎鏡像是centos:7,創建出來的容器,嚴格意義上講,它是centos容器,但這是個安裝了jdk1.8的centos容器。

# 查詢宿主機現有鏡像
$ sudo docker images

# 使用新鏡像jdk1.8-centos7,創建守護式容器
$ sudo docker run -di --name=jdk1.8-centos7 jdk1.8-centos7

# 查看正在運行的容器,是否有jdk1.8-centos7
$ sudo docker ps

# 啓動並進入容器
$ sudo docker exec -it jdk1.8-centos7 /bin/bash
# 一進入到容器,就會進入到其“工作目錄”,即Dockerfile文件中配置的“WORKDIR”值

# 在jdk1.8-centos7容器中查詢jdk版本號
$ java -version

1568365497061



QQQQ:Dockerfile文件如何編寫,去爲centos基礎鏡像中添加更多的應用程序呢?

6. Docker私有鏡像倉庫

Docker官方的Docker hub(https://hub.docker.com)是一個用於管理公共鏡像的倉庫,我們可以從上面拉取鏡像到本地,也可以把我們自己的鏡像推送上去。但是,有時候我們的服務器無法訪問互聯網,或者你不希望將自己的鏡像放到公網當中,總之,你想建立一個私有鏡像倉庫,那麼我們就可以來搭建自己的私有倉庫,用於存儲和管理自己經常使用的鏡像。

6.1 私有鏡像倉庫的搭建

私有鏡像倉庫,本質上也是一個Docker容器,Docker官方爲此提供了一個倉庫鏡像:registry。因此,要使用私有鏡像倉庫,首先就是去獲取這個倉庫鏡像,並使用它建立一個鏡像倉庫容器

# 1、拉取私有倉庫鏡像
docker pull registry

# 2、啓動私有倉庫容器
docker run -di --name=registry -p 5000:5000 registry
# 3、打開瀏覽器 輸入地址http://宿主機ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有倉庫
搭建成功
# 4、修改daemon.json
vi /etc/docker/daemon.json
# 在上述文件中添加一個key,保存退出。此步用於讓 docker 信任私有倉庫地址;注意將宿主機ip修改爲自己宿主
機真實ip
{"insecure-registries":["宿主機ip:5000"]}
# 5、重啓docker 服務
systemctl restart docker
docker start registr

1568368126087


6.2 上傳鏡像到私有倉庫

# 0、查看當前宿主機的鏡像
$ sudo docker images

# 1、標記某個鏡像爲私有倉庫的鏡像
# 例如:將自己創建的 jdk1.8-centos7 標記爲私有倉庫鏡像
$ sudo docker tag jdk1.8-centos7 宿主機IP:5000/jdk1.8-centos7
$ sudo docker tag jdk1.8-centos7 192.168.178.151:5000/jdk1.8-centos7

# 2、再次啓動私有倉庫容器
docker restart registry

# 3、上傳標記的鏡像
docker push 宿主機IP:5000/jdk1.8

# 4、輸入網址查看倉庫效果
`http://192.168.178.151:5000/v2/_catalog`

1568368723452



1568369193395

6.3 從私有倉庫拉取鏡像

分爲兩種情況:

  • 從本地私有鏡像倉庫拉取鏡像

    也就是從自己主機上配置的私有鏡像倉庫中拉取鏡像

    ----實踐中,這種情況不多。通常是自己個人的需要,製作了新的鏡像留存再用。

  • 從其他服務器上的私有鏡像倉庫拉取鏡像

    ----實踐中,這是更常見的。比如從公司的私服上拉取鏡像到自己的電腦上來用。

從本地私有鏡像倉庫拉取鏡像

直接執行如下命令:

# 私有倉庫所在的服務器上如果已經存在相關鏡像,要先刪除(指定鏡像名刪除,不是指定id)。而且該鏡像不能已經被其他容器所關聯(有存在的容器是使用該鏡像創建的容器)
$ sudo docker rmi 服務器ip:5000/jdk1.8-centos7

#拉取鏡像
$ sudo docker pull 服務器ip:5000/jdk1.8-centos7

#可以通過如下命令查看 docker 的信息;瞭解到私有倉庫地址
$ sudo docker info

從其他服務器上的私有鏡像倉庫拉取鏡像

大多數情況下,都是在一臺A服務器部上署了私有鏡像倉庫之後,其它服務器從A服務器上的私有鏡像倉庫中拉取鏡像。

若要拉取私有倉庫鏡像,需要去修改本機docker的配置文件,設置啓動時候的倉庫地址。

這裏所說的docker配置文件在哪裏?

/usr/lib/systemd/system/docker.service文件,這是Docker的安裝文件

# 打開docker配置文件(建議使用EditPlus去編輯Linux的配置文件)
vi /usr/lib/systemd/system/docker.service	# 使用命令去編輯,需要在root用戶權限下

# 按下圖,去添加如下的內容(注意修改下面內容中的ip地址爲自己當前所用的宿主機IP)
--add-registry=192.168.178.151:5000 --insecure-registry=192.168.178.151:5000 \	# 最後反斜槓莫丟


# 修改完後需要重新加載docker配置文件並重啓docker
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

1568371641258

反斜槓表示,內容都是屬於ExecStart,但是換一行顯示。

然後,就可以直接從其他服務器上的私有鏡像倉庫拉取鏡像,像從本地私有倉庫或公有鏡像倉庫去拉取鏡像一樣。

# 拉取鏡像		
$ sudo docker pull jdk1.8-centos7	# 不需要再寫成`docker pull IP:端口/jdk1.8-centos7`

# 查看鏡像
$ sudo docker images

附錄:Docker運行圖

1568371421777

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章