Docker的使用筆記


介紹Docker

Docker為了解決依賴的兼容問題的,采用了兩個手段:

  • 將應用的Libs(函數庫)、Deps(依賴)、配置與應用一起打包

  • 將每個應用放到一個隔離容器去運行,避免互相干擾

Docker鏡像中包含完整運行環境,包括系統函數庫,僅依賴系統的Linux內核,因此可以在任意Linux操作系統上運行。

Docker是一個快速交付應用、運行應用的技術,具備下列優勢:

  • 可以將程序及其依賴、運行環境一起打包為一個鏡像,可以遷移到任意Linux操作系統

  • 運行時利用沙箱機制形成隔離容器,各個應用互不干擾

  • 啟動、移除都可以通過一行命令完成,方便快捷

Docker和虛擬機的差異:

  • docker是一個系統進程;虛擬機是在操作系統中的操作系統

  • docker體積小、啟動速度快、性能好;虛擬機體積大、啟動速度慢、性能一般

Docker中有幾個重要的概念:

鏡像(Image):Docker將應用程序及其所需的依賴、函數庫、環境、配置等文件打包在一起,稱為鏡像。

容器(Container):鏡像中的應用程序運行后形成的進程就是**容器**,只是Docker會給容器進程做隔離,對外不可見。

一切應用最終都是代碼組成,都是硬盤中的一個個的字節形成的**文件**。只有運行時,才會加載到內存,形成進程。

鏡像,就是把一個應用在硬盤上的文件、及其運行環境、部分系統函數庫文件一起打包形成的文件包。這個文件包是只讀的。

容器,就是將這些文件中編寫的程序、函數加載到內存中允許,形成進程,只不過要隔離起來。因此一個鏡像可以啟動多次,形成多個容器進程。

DockerHub

DockerHub是一個官方的Docker鏡像的托管平台。

 

安裝Docker(基於CentOS7)

 

Docker CE 支持 64 位版本 CentOS 7,並且要求內核版本不低於 3.10, CentOS 7 滿足最低內核的要求,所以我們在CentOS 7安裝Docker。

卸載之前的Docker

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine \
                  docker-ce

 安裝 

yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2 --skip-broken

  更新本地鏡像源

# 設置docker鏡像源
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

yum makecache fast

  然后輸入命令

yum install -y docker-ce

  啟動Docker之前要關閉防火牆,因為Docker所需要調用的端口很多,為避免被防火牆攔截

# 關閉
systemctl stop firewalld
# 禁止開機啟動防火牆
systemctl disable firewalld

  通過命令啟動docker

systemctl start docker  # 啟動docker服務
systemctl stop docker  # 停止docker服務
systemctl restart docker  # 重啟docker服務

  然后輸入命令,可以查看docker版本

docker -v

  配置鏡像加速(參考阿里雲鏡像加速器文檔)

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://w78qzotl.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

  

DockerCompose

Compose文件是一個文本文件,定義、運行多個容器,通過yml配置,再通過指令定義集群中的每個容器如何運行,就像運行一個腳本。

下載DockerCompose

# 安裝
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

修改文件權限

# 修改權限
chmod +x /usr/local/bin/docker-compose

Base自動補全命令

echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts

  

# 補全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

  


鏡像操作

首先來看下鏡像的名稱組成:

  • 鏡名稱一般分兩部分組成:[repository]:[tag]。

  • 在沒有指定tag時,默認是latest,代表最新版本的鏡像

拉取、查看鏡像

 根據在DockerHub查看到的鏡像名稱,拉取自己需要的鏡像,通過命令:docker pull nginx

通過命令:docker images 查看拉取到的鏡像

 

保存、導入鏡像

 查看save命令用法,可以輸入命令:docker save --help

docker save -o [保存的目標文件名稱] [鏡像名稱]

使用docker save導出鏡像到磁盤

docker save -o nginx.tar nginx:latest

  

使用docker load加載鏡像

 刪除本地的nginx鏡像

docker rmi nginx:latest

  

運行命令,加載本地文件:

 
docker load -i nginx.tar

 


容器操作

 

容器保護三個狀態:

  • 運行:進程正常運行

  • 暫停:進程暫停,CPU不再運行,並不釋放內存

  • 停止:進程終止,回收進程占用的內存、CPU等資源

 

其中:

  • docker run:創建並運行一個容器,處於運行狀態

  • docker pause:讓一個運行的容器暫停

  • docker unpause:讓一個容器從暫停狀態恢復運行

  • docker stop:停止一個運行的容器

  • docker start:讓一個停止的容器再次運行

  • docker rm:刪除一個容器

創建並運行一個容器

docker run --name containerName -p 80:80 -d nginx

  

命令解讀:

- docker run :創建並運行一個容器
- --name : 給容器起一個名字,比如叫做mn
- -p :將宿主機端口與容器端口映射,冒號左側是宿主機端口,右側是容器端口
- -d:后台運行容器
- nginx:鏡像名稱,例如nginx

 

這里的`-p`參數,是將容器端口映射到宿主機端口。

默認情況下,容器是隔離環境,我們直接訪問宿主機的80端口,肯定訪問不到容器中的nginx。

現在,將容器的80與宿主機的80關聯起來,當我們訪問宿主機的80端口時,就會被映射到容器的80,這樣就能訪問到nginx了:

 

數據卷(容器數據管理)

 

 數據卷(volume)是一個虛擬目錄,指向宿主機文件系統中的某個目錄。

數據卷操作的基本語法:docker volume [COMMAND]

docker volume命令是數據卷操作,根據命令后跟隨的command來確定下一步的操作:

  • create 創建一個volume

  • inspect 顯示一個或多個volume的信息

  • ls 列出所有的volume

  • prune 刪除未使用的volume

  • rm 刪除一個或多個指定的volume

創建和查看數據卷

創建數據卷

 
docker volume create html

  查看所有數據

docker volume ls

  

查看數據卷詳細信息卷

 
docker volume inspect html

  

掛載數據卷

 

docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx

  

這里的-v就是掛載數據卷的命令:

  • -v html:把html數據卷掛載到容器內的/usr/share/nginx/html這個目錄中

 查看在本地磁盤數據卷位置

# 查看html數據卷的位置
docker volume inspect html

  

 

容器不僅僅可以掛載數據卷,也可以直接掛載到宿主機目錄上。關聯關系如下:

  • 帶數據卷模式:宿主機目錄 --> 數據卷 ---> 容器內目錄

  • 直接掛載模式:宿主機目錄 ---> 容器內目錄

 

目錄掛載與數據卷掛載的語法是類似的:

  • -v [宿主機目錄]:[容器內目錄]

  • -v [宿主機文件]:[容器內文件]

數據卷掛載與目錄直接掛載的區別:

  • 數據卷掛載耦合度低,由docker來管理目錄,但是目錄較深,不好找

  • 目錄掛載耦合度高,需要我們自己管理目錄,不過目錄容易尋找查看

 

Dockerfile自定義鏡像

常見的鏡像在DockerHub就能找到,但是我們自己寫的項目就必須自己構建鏡像了。

基於Ubuntu構建Java項目

步驟1:新建一個空文件夾docker-demo

步驟2:拷貝jar文件到docker-demo這個目錄

步驟3:拷貝jdk8.tar.gz文件到docker-demo這個目錄

步驟4:拷貝Dockerfile到docker-demo這個目錄

Dockerfile:

# 指定基礎鏡像
FROM ubuntu:16.04
# 配置環境變量,JDK的安裝目錄
ENV JAVA_DIR=/usr/local

# 拷貝jdk和java項目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar

# 安裝JDK
RUN cd $JAVA_DIR \
 && tar -xf ./jdk8.tar.gz \
 && mv ./jdk1.8.0_144 ./java8

# 配置環境變量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin

# 暴露端口
EXPOSE 8090
# 入口,java項目的啟動命令
ENTRYPOINT java -jar /tmp/app.jar

步驟5:將准備好的docker-demo上傳到虛擬機任意目錄,然后進入docker-demo目錄下

步驟6:運行命令:

docker build -t javaweb:1.0 .

  

基於java8構建Java項目

雖然我們可以基於Ubuntu基礎鏡像,添加任意自己需要的安裝包,構建鏡像,但是卻比較麻煩。所以大多數情況下,我們都可以在一些安裝了部分軟件的基礎鏡像上做改造。

例如,構建java項目的鏡像,可以在已經准備了JDK的基礎鏡像基礎上構建。

 

需求:基於java:8-alpine鏡像,將一個Java項目構建為鏡像

實現思路如下:

  • ① 新建一個空的目錄,然后在目錄中新建一個文件,命名為Dockerfile

  • ② 拷貝課前資料提供的docker-demo.jar到這個目錄中

  • ③ 編寫Dockerfile文件:

    • a )基於java:8-alpine作為基礎鏡像

    • b )將app.jar拷貝到鏡像中

    • c )暴露端口

    • d )編寫入口ENTRYPOINT

FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
EXPOSE 8090
ENTRYPOINT java -jar /tmp/app.jar

  

小結:

  1. Dockerfile的本質是一個文件,通過指令描述鏡像的構建過程

  2. Dockerfile的第一行必須是FROM,從一個基礎鏡像來構建

  3. 基礎鏡像可以是基本操作系統,如Ubuntu。也可以是其他人制作好的鏡像,例如:java:8-alpine

Docker-Compose

Docker Compose可以基於Compose文件幫我們快速的部署分布式應用,而無需手動一個個創建和運行容器!

 示例:

version: "3.8"
 services:
  mysql:
    image: mysql:5.7.25
    environment:
     MYSQL_ROOT_PASSWORD: 123 
    volumes:
     - "/tmp/mysql/data:/var/lib/mysql"
     - "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
  web:
    build: .
    ports:
     - "8090:8090"

  

上面的Compose文件就描述一個項目,其中包含兩個容器:

  • mysql:一個基於mysql:5.7.25鏡像構建的容器,並且掛載了兩個目錄

  • web:一個基於docker build臨時構建的鏡像容器,映射端口時8090

version: "3.2"

services:
  nacos:
    image: nacos/nacos-server
    environment:
      MODE: standalone
    ports:
      - "8848:8848"
  mysql:
    image: mysql:5.7.25
    environment:
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "$PWD/mysql/data:/var/lib/mysql"
      - "$PWD/mysql/conf:/etc/mysql/conf.d/"
  userservice:
    build: ./user-service
  orderservice:
    build: ./order-service
  gateway:
    build: ./gateway
    ports:
      - "10010:10010"

  

可以看到,其中包含5個service服務:

  • nacos:作為注冊中心和配置中心

    • image: nacos/nacos-server: 基於nacos/nacos-server鏡像構建

    • environment:環境變量

      • MODE: standalone:單點模式啟動

    • ports:端口映射,這里暴露了8848端口

  • mysql:數據庫

    • image: mysql:5.7.25:鏡像版本是mysql:5.7.25

    • environment:環境變量

      • MYSQL_ROOT_PASSWORD: 123:設置數據庫root賬戶的密碼為123

    • volumes:數據卷掛載,這里掛載了mysql的data、conf目錄,其中有我提前准備好的數據

  • userserviceorderservicegateway:都是基於Dockerfile臨時構建的

修改微服務配置

因為微服務將來要部署為docker容器,而容器之間互聯不是通過IP地址,而是通過容器名。這里我們將order-service、user-service、gateway服務的mysql、nacos地址都修改為基於容器名的訪問。

spring:
  datasource:
    url: jdbc:mysql://mysql:3306/cloud_order?useSSL=false
    username: root
    password: 123
    driver-class-name: com.mysql.jdbc.Driver
  application:
    name: orderservice
  cloud:
    nacos:
      server-addr: nacos:8848 # nacos服務地址

  

 打包(包名)

可以通過修改pom.xml中的打包名稱來實現

<build>
  <!-- 服務打包的最終名稱 -->
  <finalName>app</finalName>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>

 

拷貝jar包到部署目錄

編譯打包好的app.jar文件,需要放到Dockerfile的同級目錄中

 

部署

 們需要將文件整個cloud-demo文件夾上傳到虛擬機中,理由DockerCompose部署

上傳到任意目錄,進入cloud-demo目錄,然后運行下面的命令:

docker-compose up -d

 

Docker 倉庫管理 

目前 Docker 官方維護了一個公共倉庫 Docker Hub

注冊

https://hub.docker.com 免費注冊一個 Docker 賬號。

登錄

docker login

  登錄需要輸入用戶名和密碼,登錄成功后,我們就可以從 docker hub 上拉取自己賬號下的全部鏡像。

退出

docker logout

  拉取鏡像

可以通過 docker search 命令來查找官方倉庫中的鏡像,並利用 docker pull 命令來將它下載到本地

推送鏡像

用戶登錄后,可以通過 docker push 命令將自己的鏡像推送到 Docker Hub

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM