Docker 中級篇

Docker 鏡像理解

Docker 鏡像是什麼

鏡像是一種輕量級、可執行的獨立軟件包,用來打包軟件運行環境和基於運行環境開發的軟件,它包含運行某個軟件所需的所有內容,包括代碼、運行時庫、環境變量和配置文件

Docker 鏡像加載原理

UnionFs:聯合文件系統

UnionFs(聯合文件系統):Union 文件系統 (UnionFs) 是一種分層、輕量級並且高性能的文件系統,它支持對文件系統的修改作爲一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下,UnionFs 聯合文件系統是 Docker 鏡像的基礎,鏡像可以通過分層來進行繼承,基於基礎鏡像(沒有父鏡像),可以製作各種具體的應用鏡像 特性:一次同時加載多個文件系統,但從外面看起來,只能看到一個文件系統,聯合加載會把各層文件系統疊加起來,這樣最終的文件系統會包含所有底層的文件和目錄

Docker 鏡像加載原理

Docker 的鏡像實際上由一層一層的 UnionFs 文件系統組成 bootfs:主要包含 bootloader 和 Kernel,bootloader 主要是引導加 kernel,Linux 剛啓動時會加 bootfs 文件系統,在 Docker 鏡像的最底層是 bootfs,這一層與我們典型的 Linux/Unix 系統是一樣的,包含 bootfs 加載器和內核,當 bootfs 加載完成之後整個內核就都在內存中了,此時內存的使用權已由 bootfs 轉交給內核,此時系統也會卸載 bootfs。

rootfs:在 bootfs 之上,包含的就是典型 Linux 系統中的 / dev、/proc、/bin、/etc 等標準目錄和文件,rootfs 就是各種不同的操作系統發行版,比如:Ubuntu,、CentOS 等等

簡單理解:

1. 對於 Docker 安裝 OS 來說:就是 Docker 使用了 Linux 本身的 bootfs,只需要安裝自己所需的 rootfs。

2. 對於 Docker 安裝普通鏡像來說:就是 Docker 本身是分層下載鏡像,所以可以提取出公共層鏡像,進行復用。

Docker 鏡像的特點

Docker 鏡像都是隻讀的,當容器啓動時,一個新的可寫層加載到鏡像的頂部

這一層就是我們通常說的容器層,容器之下的都叫鏡像層

Commit 鏡像

# 提交本地鏡像 
# -a:作者信息 -m:描述信息 容器ID 鏡像名稱:版本信息
docker commit -a="test" -m="test" 容器id tomcat01:1.0

Docker 容器數據卷

什麼是容器數據卷

容器之間可以有一個數據共享的技術!Docker 容器中產生的數據,同步到本地!

這就是卷技術!目錄的掛載,將我們容器內的目錄,掛載到 Linux 上面!

容器數據卷使用命令

# 命令
docker run -it -v 主機目錄:容器內目錄 /bin/bash

掛載 MySQL 數據庫到 Liunx 宿主機

# 1. 下載MySQL
docker pull mysql
# 2. 啓動並掛載 -e:特別注意需要設置密碼
docker run -d -p 3344:3306 -v /home/conf:/etc/mysql/conf.d -v /home/logs:/logs -v /home/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql

此時我們使用遠程連接軟件會報錯

# 解決報錯
# 1. 進入容器內
docker exec -it 容器ID /bin/bash
# 2. 進入MySQL
mysql -uroot -p123456
# 3. 授權
mysql> GRANT ALL ON *.* TO 'root'@'%';
# 4. 刷新權限:
mysql> flush privileges;
# 5. 更新加密規則:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
# 6. 更新root用戶密碼:
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 7. 刷新權限:
mysql> flush privileges;

具名和匿名掛載

-v 容器內路徑          # 匿名掛載
-v 卷名:容器內路徑         # 具名掛載
-v 宿主機路徑:容器內路徑 # 指定路徑掛載
Docker容器內的卷,在沒有指定目錄的情況下都在/var/lib/docker/volumes/xxx/_data下

拓展:綁定權限

# 通過 -v 容器內路徑:ro rw 改變讀寫權限
ro # readonly 只讀
rw # readwrite 可讀可寫
docker run -d nginx01 -v nginxdemo:/etc/nginx:ro nginx
docker run -d nginx01 -v nginxdemo:/etc/nginx:rw nginx
# ro:只要看到ro就說明這個路徑只能通過宿主機來操作,容器內部是無法操作

數據卷容器掛載

目的:實現多個容器間的數據同步 (多個 MySQL 間共享數據)

# 使用 --volumes-from 容器名稱 此命令實現數據卷容器掛載
docker run -d --name mysql02 -p 3345:3306 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=123456 mysql

DockerFile

DockerFile是用來構建 Docker 鏡像的文件 (命令參數腳本)

DockerFile 構建指令

FROM                # 基礎鏡像,一切從這裏開始構建
MAINTAINER             # 鏡像是誰寫的, 姓名+郵箱
RUN                    # 鏡像構建的時候需要運行的命令
ADD                    # 步驟,tomcat鏡像,這個tomcat壓縮包!添加內容 添加同目錄
WORKDIR                # 鏡像的工作目錄
VOLUME                # 掛載的目錄
EXPOSE                # 保留端口配置
CMD                    # 指定這個容器啓動的時候要運行的命令,只有最後一個會生效,可被替代
ENTRYPOINT            # 指定這個容器啓動的時候要運行的命令,可以追加命令
COPY                # 類似ADD,將我們文件拷貝到鏡像中
ENV                    # 構建的時候設置環境變量!

創建一個自己的 CentOS 鏡像

vim mycentos
FROM centos
MAINTAINER MT<1746344046@qq.com>

ENV MYPATH /usr/local
WORKEDIR $MYPATH

RUN yum -y install vim

EXPOSE 80

CMD /bin/bash
docker build -f mycentos -t mycentosdemodo:1.0 .
docker history 鏡像ID

創建 Tomcat 鏡像

  1. 準備鏡像文件:Tomcat 和 JDK 的壓縮包

  2. 編寫 DockerFile

FROM centos
MAINTAINER fortuneteller<1746344046@qq.com>

COPY README.txt /usr/local/README.txt

ADD jdk-8u251-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.35.tar.gz /usr/local

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_251
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35
ENV CATALINA_BASH /usr/local/apache-toacat-9.0.35
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD ["/usr/local/apache-tomcat-9.0.35/bin/catalina.sh""run"]
  1. 打包鏡像
# 這裏使用的是Dockerfile來明白的腳本,所以省略-f
docker build -t mytomcat .
  1. 啓動鏡像
docker run -d -p 3344:8080 --name mttomcat -v /home/fortuneteller/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test -v /home/fortuneteller/tomcat/logs:/usr/local/apache-tomcat-9.0.35/logs mytomcat
  1. 測試運行

  1. 在宿主機的/home/fortuneteller/tomcat/test目錄下創建WEB-INF目錄與mt.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>docker</title>
</head>
<body>
----------welcome------------
<%="這是一個測試頁面"%>
</body>
</html>
  1. WEB-INF目錄下編寫web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <display-name>test</display-name>
</web-app>
  1. 測試訪問

本地鏡像上傳阿里雲

  1. 登陸阿里雲容器鏡像服務

  2. 創建命名空間

  3. 創建倉庫

  4. 設置固定密碼

  1. 查看自己的推送命令

  1. 使用推送命令完成上傳

  1. 拉取時同理根據阿里雲提示命令完成即可

Docker 總結

Docker 部署 SpringBoot 項目

  1. 使用 Maven 構建獲得 jar 包

  2. 編寫 Dockerfile

FROM java:8

COPY *.jar /app.jar

CMD ["--server.port=8080"]

EXPOSE 8080

ENTRYPOINT ["java""jar""app.jar"]
  1. 上傳 Docker 與 jar 包到 Linux 服務器

  2. 使用命令獲得鏡像

docker build -t ideatest .
  1. 使用命令查看獲取到鏡像編號
docker images
  1. 啓動鏡像
docker run -d -p 3344:8080 ideatest  # 3344端口需要提前在阿里雲放開
  1. 測試訪問

在瀏覽器輸入:服務器 ip:3344

原文轉自:http://suo.im/5LhC1f
作者:Fortuneteller

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/qV7MPhcjhC57EBOfqFu9eA