分享一些我自己的docker使用經驗

haohaoxuexiyai發表於2020-12-26

一、mydocker

上手docker可以在windows上裝一個虛擬機器管理工具,模擬Linux下的環境,非常方便。

部署docker涉及到pull images,需要訪問部署於國外的映象伺服器(訪問極慢),國內有很多docker的映象伺服器,選一個用萬事大吉,這裡安利個阿里的:

阿里雲映象加速器:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

要完成映象的相關配置:

/etc/docker/daemon.json,檔案末尾增加如下內容

{
"registry-mirrors": ["https://你的ID.mirror.aliyuncs.com"]
}

二、docker架構

在這裡插入圖片描述

docker從遠端倉庫中下載映象到本地,生成容器實體執行

  • 映象(Image):Docker 映象(Image),就相當於是一個 root 檔案系統。比如官方映象 ubuntu:16.04 就包含了 完整的一套 Ubuntu16.04 最小系統的 root 檔案系統。

  • 容器(Container):映象(Image)和容器(Container)的關係,就像是物件導向程式設計中的類和物件一樣, 映象是靜態的定義,容器是映象執行時的實體。容器可以被建立、啟動、停止、刪除、暫停等。

  • 倉庫(Repository):倉庫可看成一個程式碼控制中心,用來儲存映象。

三、docker命令

3.1.程式相關命令

程式daemon操作docker的命令

啟動docker服務:

systemctl start docker

停止docker服務:

systemctl stop docker

重啟docker服務:

systemctl restart docker

檢視docker服務狀態:

systemctl status docker

設定開機啟動docker服務:

systemctl enable docker

3.2.映象相關命令

映象命令包括如下內容:檢視映象、搜尋映象 、拉取映象 、刪除映象

檢視映象: 檢視本地所有的映象

docker images
docker images –q # 檢視所用映象的id

搜尋映象:從網路中查詢需要的映象

docker search 映象名稱
docker search redis #查詢redis映象

拉取映象:從Docker倉庫下載映象到本地,映象名稱格式為名稱:版本號,如果版本號不指定則是最新的版本 lastest。

如果不知道映象版本,可以去docker hub 搜尋對應映象檢視。

https://hub.docker.com/

docker pull 映象名稱
docker pull redis #下載最新版本redis
docker pull redis:5.0 #下載5.0版本redis

刪除映象: 刪除本地映象

docker rmi 映象id # 刪除指定本地映象
# 例如:docker rmi aa27923130e6(imageId)
# 例如:docker rmi redis:5.0(imageName+imageTag)
docker images -q #檢視所有的映象列表
docker rmi `docker images -q` # 刪除所有本地映象

3.3.容器相關命令

檢視容器、建立容器、進入容器、啟動容器、停止容器、刪除容器、檢視容器資訊

檢視一個命令可以帶哪些引數組合,可以在命令後加上--help

檢視容器

docker ps # 檢視正在執行的容器
docker ps –a # 檢視所有容器
docker ps –a # 檢視所有容器id
docker ps --help # 檢視引數提示

建立並啟動容器

docker run 引數

引數說明:

  • -i:保持容器執行。通常與 -t 同時使用。加入it這兩個引數後,容器建立後自動進入容器中,退出容器後,容 器自動關閉。
  • -t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用。
  • -d:以守護(後臺)模式執行容器。建立一個容器在後臺執行,需要使用docker exec 進入容器。退出後,容器不會關閉。
  • -it 建立的容器一般稱為互動式容器,-id 建立的容器一般稱為守護式容器
  • –name:為建立的容器命名。
docker run -it --name=c1 centos:7 /bin/bash #建立互動式容器(/bin/bash預設也可以不寫)
docker run -id --name=c2 centos:7 #建立守護式容器

注意:互動式容器,exit後容器自動關閉,守護式容器會在後臺執行

進入容器

docker exec -it c2 /bin/bash #進入容器,進入的時候不能省略
docker exec -it 49d63fdf81d4 /bin/bash #進入容器

停止容器

docker stop 容器名稱
docker stop 容器id

啟動容器

docker start 容器名稱

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

docker rm 容器名稱
docker rm 容器id

檢視容器資訊

docker inspect 容器名稱

刪除所有容器

docker rm `docker ps -aq`

四、Docker容器的資料卷

4.1 資料卷概念及作用

Docker 容器刪除後,在容器中產生的資料還在嗎?不在了

在這裡插入圖片描述

Docker 容器和外部機器可以直接交換檔案嗎?不可以

在這裡插入圖片描述

容器之間想要進行資料互動?

在這裡插入圖片描述

資料卷概念

  • 資料卷是宿主機中的一個目錄或檔案

  • 當容器目錄和資料卷目錄繫結後,對方的修改會立即同步

  • 一個資料卷可以被多個容器同時掛載

  • 一個容器也可以被掛載多個資料卷

資料卷的作用

  • 容器資料持久化
  • 外部機器和容器間接通訊
  • 容器之間資料交換

4.2 配置資料卷

建立啟動容器時,使用 –v 引數 設定資料卷

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

注意事項:

  1. 容器目錄必須是絕對路徑
  2. 如果宿主機目錄或容器內目錄不存在,會自動建立
  3. 可以用多個-v掛載多個資料卷
  • 演示資料卷持久化

建立c1掛載/root/data到/root/data_container

docker run -it --name=c1 -v /root/data:/root/data_container centos:7 /bin/bash
  • 演示一個容器掛載多個資料卷
docker run -it --name=c2 \
-v ~/data2:/root/data2 \
-v ~/data3:/root/data3 \
centos:7
  • 兩個容器掛載同一個資料卷
docker run -it --name=c3 -v /root/data:/root/data_container centos:7 /bin/bash
docker run -it --name=c4 -v /root/data:/root/data_container centos:7 /bin/bash

4.3 配置資料卷容器

多容器進行資料交換,多個容器掛載同一個資料卷容器,完成資料互動

在這裡插入圖片描述

1.建立啟動c3資料卷容器,使用 –v 引數 設定資料卷

docker run -it --name=c3 -v /volume centos:7 /bin/bash

這裡沒有指定宿主機目錄,預設生成一個宿主機目錄

docker inspect c3 #檢視c3

2.建立啟動 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

使用 c3資料卷容器建立c1,c2,這時即使c3關閉不影響c3,c4互動

4.3 資料卷小結

1.資料卷概念

  • 宿主機的一個目錄或檔案,可以是目錄掛載目錄,也可以是檔案掛載檔案

2.資料卷作用

  • 容器資料持久化
  • 客戶端和容器資料交換
  • 容器間資料交換

3.資料卷容器

  • 建立一個容器,掛載一個目錄,讓其他容器繼承自該容器( --volume-from )。
  • 通過簡單方式實現資料卷配置

五、Docker應用部署

5.1.MySQL部署

分析

  • 容器內的網路服務和外部機器不能直接通訊
  • 外部機器和宿主機可以直接通訊
  • 宿主機和容器可以直接通訊
  • 當容器中的網路服務需要被外部機器訪問時,可以將容器中提供服務的埠對映到宿主機的埠上。外部機 器訪問宿主機的埠,從而間接訪問容器的服務。
  • 這種操作稱為:埠對映

在這裡插入圖片描述

1.搜尋mysql映象

docker search mysql

2.拉取mysql映象

docker pull mysql:5.6

3.建立容器,設定埠對映、目錄對映

# 在/root目錄下建立mysql目錄用於儲存mysql資料資訊
mkdir ~/mysql
cd ~/mysql
docker run -id \
-p 3307:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.6
  • 引數說明:
    • ***-p 3307:3306:***將容器的 3306 埠對映到宿主機的 3307 埠。
    • ***-v $PWD/conf:/etc/mysql/conf.d:***將主機當前目錄下的 conf/my.cnf 掛載到容器的 /etc/mysql/my.cnf。配置目錄
    • ***-v $PWD/logs:/logs:***將主機當前目錄下的 logs 目錄掛載到容器的 /logs。日誌目錄
    • ***-v $PWD/data:/var/lib/mysql :***將主機當前目錄下的data目錄掛載到容器的 /var/lib/mysql 。資料目 錄
    • ***-e MYSQL_ROOT_PASSWORD=123456:***初始化 root 使用者的密碼。

4.進入容器,操作mysql

docker exec -it c_mysql /bin/bash
mysql -uroot -p123456
show databases;
create database db1;

5.使用外部機器連線容器中的mysql

5.2.Tomcat部署

1.搜尋tomcat映象

docker search tomcat

2.拉取tomcat映象

docker pull tomcat

3.建立容器,設定埠對映、目錄對映

# 在/root目錄下建立tomcat目錄用於儲存tomcat資料資訊
mkdir ~/tomcat
cd ~/tomcat
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
  • 引數說明:
    • ***-p 8080:8080:***將容器的8080埠對映到主機的8080埠
    • ***-v $PWD:/usr/local/tomcat/webapps:***將主機中當前目錄掛載到容器的webapps

4.在tomcat主機下建立一個web應用

以後我們部署的應用想要往tomcat裡部署,只要往宿主機中的資料卷中放即可

[root@docker-cry001 tomcat]# mkdir test
[root@docker-cry001 tomcat]# cd test
[root@docker-cry001 test]# vi index.html

5.使用外部機器訪問tomcat

http://192.168.122.133:8080/test/index.html

在這裡插入圖片描述

5.3.Nginx部署

Nginx經常用於做反向代理和負載均衡,經常需要修改配置檔案,故需要建立配置檔案的資料卷對映

1.搜尋nginx映象

docker search nginx

2.拉取nginx映象

docker pull nginx

3.建立容器,設定埠對映、目錄對映

# 在/root目錄下建立nginx目錄用於儲存nginx資料資訊
mkdir ~/nginx
cd ~/nginx
mkdir conf
cd conf
# 在~/nginx/conf/下建立nginx.conf檔案,貼上下面內容
vim nginx.conf
user nginx;
worker_processes 1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
	worker_connections 1024;
}

http {
	include 		/etc/nginx/mime.types;
	default_type 	application/octet-stream;
	
	log_format main '$remote_addr - $remote_user [$time_local] "$request" '
					'$status $body_bytes_sent "$http_referer" '
					'"$http_user_agent" "$http_x_forwarded_for"';
					
    access_log	/var/log/nginx/access.log	main;

    sendfile 		on;
    #tcp_nopush 	on;

    keepalive_timeout	65;

    #gzip on;
    include /etc/nginx/conf.d/*.conf;

}
docker run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
  • 引數說明:
    • ***-p 80:80:***將容器的 80埠對映到宿主機的 80 埠。
    • ***-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:***將主機當前目錄下的 /conf/nginx.conf 掛載到容 器的 :/etc/nginx/nginx.conf。配置目錄
    • ***-v $PWD/logs:/var/log/nginx:***將主機當前目錄下的 logs 目錄掛載到容器的/var/log/nginx。日誌目 錄

4.在nginx主機下建立一個web應用

以後我們部署的應用想要往tomcat裡部署,只要往宿主機中的資料卷中放即可

[root@docker-cry001 tomcat]# mkdir test
[root@docker-cry001 tomcat]# cd test
[root@docker-cry001 test]# vi index.html

5.使用外部機器訪問nginx

http://192.168.122.133/

在這裡插入圖片描述

5.4.Redis部署

1.搜尋redis映象

docker search redis

2.拉取redis映象

docker pull redis:5.0

3.建立容器,設定埠對映

docker run -id --name=c_redis -p 6379:6379 redis:5.0

4.使用外部機器連線redis

./redis-cli.exe -h 192.168.220.12 -p 6379
keys *
set name cry
get name

六、Dockerfile

Dockerfile是一種映象製作的主要方法

6.1. Docker映象原理

linux作業系統組成部分:

  • 程式排程子系統
  • 程式通訊子系統
  • 記憶體管理子系統
  • 裝置管理子系統
  • 檔案管理子系統
  • 網路通訊子系統
  • 作業控制子系統

Linux檔案系統由bootfs和rootfs兩部分組成

  • bootfs:包含bootloader(引導載入程式)和 kernel(核心)
  • rootfs: root檔案系統,包含的就是典型 Linux 系統中的/dev,/proc,/bin,/etc等標準目錄和檔案
  • 不同的linux發行版,bootfs基本一樣,而rootfs不同,如ubuntu,centos等

docker映象原理

  • Docker映象是由特殊的檔案系統疊加而成
  • 最底端是 bootfs,並使用宿主機的bootfs
  • 第二層是 root檔案系統rootfs,稱為base image
  • 然後再往上可以疊加其他的映象檔案
  • 統一檔案系統(Union File System)技術能夠將不同的層整合成一個檔案系統,為這些層提供了一個統一的 視角,這樣就隱藏了多層的存在,在使用者的角度看來,只存在一個檔案系統。
  • 一個映象可以放在另一個映象的上面。位於下面的映象稱為父映象,最底部的映象成為基礎映象。
  • 當從一個映象啟動容器時,Docker會在最頂層載入一個讀寫檔案系統作為容器

在這裡插入圖片描述

現在我們可以解決幾個問題:

1.Docker 映象本質是什麼?

  • 是一個分層檔案系統

2.Docker 中一個centos映象為什麼只有200MB,而一個centos作業系統的iso檔案要幾個個G?

  • Centos的iso映象檔案包含bootfs和rootfs,而docker的centos映象複用作業系統的bootfs,只有rootfs和其 他映象層。

3.Docker 中一個tomcat映象為什麼有600MB,而一個tomcat安裝包只有70多MB?

  • 由於docker中映象是分層的,tomcat雖然只有70多MB,但他需要依賴於父映象和基礎映象,所有整個對外 暴露的tomcat映象大小600多MB

6.2. 映象製作

6.2.1 容器轉映象

可寫容器 => 新的映象(不包括資料卷中資料) => 壓縮 => 解壓出另一個映象

docker commit 容器id 映象名稱:版本號
docker save -o 壓縮檔名稱 映象名稱:版本號
docker load –i 壓縮檔名稱
# 建立tomcat映象
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat

# 進入tomcat映象
docker exec -it c_tomcat /bin/bash

#建立a.txt b.txt
cd ~
touch a.txt b.txt

#容器轉映象
docker commit cef7695e0773 cry_tomcat:1.0

#壓縮映象
docker save -o cry_tomcat.tar cry_tomcat:1.0

#刪除原來映象
docker rmi cry_tomcat:1.0

#從壓縮檔案載入映象
docker load -i cry_tomcat.tar

#產生映象
docker run -it --name=new_tomcat cry_tomcat:1.0 /bin/bas

#進入檢視內容
docker exec -it c_tomcat /bin/bash
#可以看到a.txt b.txt存在,而webapps/test不存在
6.2.2 dockerfile

概念

  • Dockerfile 是一個文字檔案
  • 包含了一條條的指令
  • 每一條指令構建一層,基於基礎映象,最終構建出一個新的映象
  • 對於開發人員:可以為開發團隊提供一個完全一致的開發環境
  • 對於測試人員:可以直接拿開發時所構建的映象或者通過Dockerfile檔案構建一個新的映象開始工作了
  • 對於運維人員:在部署時,可以實現應用的無縫移植

參考Dochub網址:https://hub.docker.com ,比如centos和nginx映象

一、我們可以自定義一個centos7映象

要求:

  1. 預設登入路徑為 /usr
  2. 可以使用vim

實現步驟

  • 定義父映象:FROM centos:7
  • 定義作者資訊:MAINTAINER cry cry@cry.cn
  • 執行安裝vim命令: RUN yum install -y vim
  • 定義預設的工作目錄:WORKDIR /usr
  • 定義容器啟動執行的命令:CMD /bin/bash
  • 通過dockerfile構建映象:docker bulid –f dockerfile檔案路徑 –t 映象名稱:版本 .
#具體程式碼
mkdir ~/docker-files
cd ~/docker-files
vim centos_dockerfile

dockerfile具體內容

FROM centos:7
MAINTAINER cry <cry@cry.cn>

RUN yum install -y vim
WORKDIR /usr

CMD ["/bin/bash"]
#構建多個命令可以這樣寫: CMD ["/bin/bash","",""]

build

docker build -f ./centos_dockerfile -t cry_centos:1 .
  • -f:映象檔案
  • -t:新映象名
  • . 定址路徑
#進入看效果
docker run -it --name=c2 cry_centos:1

二、我們可以自行釋出一個springboot專案練練手

  • 定義父映象:FROM java:8

  • 定義作者資訊:MAINTAINER cry cry@163.com

  • 將jar包新增到容器: ADD springboot.jar app.jar

  • 定義容器啟動執行的命令:CMD [“java”,"-jar",“app.jar”]

  • 通過dockerfile構建映象:docker bulid –f dockerfile檔案路徑 –t 映象名稱:版本 .

    FROM java:8
    MAINTAINER cry <cry@163.com>
    ADD springboot.jar app.jar
    CMD ["java","-jar","app.jar"]
    

build

docker build -f ./springboot_dockerfile -t app .

啟動容器

docker run -id -p 9000:8080 app 
#如果不指定名字, docker會自己隨機分配一個名字

七、服務編排

7.1. 概念

微服務架構的應用系統中一般包含若干個微服務,每個微服務一般都會部署多個例項,如果每個微服務都要手動啟動停止,維護的工作量會很大。來看下我們日常工作:

  • 要從Dockerfile build image 或者去dockerhub拉取image
  • 要建立多個container
  • 要管理這些container(啟動停止刪除)

通過服務編排可以大量簡化上面的工作***服務編排:按照一定的業務規則批量管理容器***

7.2. Docker Compose

Docker Compose是一個編排多容器分散式部署的工具,提供命令集中管理容器化應用的完整開發週期,包括服務構建,啟動和停止。

7.2.1 安裝Docker Compose
# Compose目前已經完全支援Linux、Mac OS和Windows,在我們安裝Compose之前,需要先安裝Docker。下面我 們以
編譯好的二進位制包方式安裝在Linux系統中。
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 設定檔案可執行許可權
chmod +x /usr/local/bin/docker-compose
# 檢視版本資訊
docker-compose -version
7.2.2 解除安裝Docker Compose
# 二進位制包方式安裝的,刪除二進位制檔案即可
rm /usr/local/bin/docker-compose

7.3 編排nginx+springboot

需求:使用nginx反向代理到springboot應用

1.建立docker-compose目錄

mkdir ~/docker-compose
cd ~/docker-compose

2.編寫 docker-compose.yml 檔案

version: '3'
services:
  nginx:
    image: nginx
    ports:
      - 80:80
    links:
      - app
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
  app:
    image: app
    expose:
      - "8080"

3.建立./nginx/conf.d目錄

mkdir -p ./nginx/conf.d

4.在./nginx/conf.d目錄下編寫app.conf檔案

server {
	listen 80;
	access_log off;
	
	location / {
		proxy_pass http://app:8080/hello;
	}
	
}

5.在~/docker-compose 目錄下使用docker-compose 啟動容器

docker-compose up -d # -d表示已守護模式啟動

6.測試訪問

http://192.168.122.130/hello

7.停止

docker-compose down

相關文章