docker

第0章 環境與安裝

1. 環境:Mac OS

安裝:brew cask install docker

2. 環境:CentOS

# 1. 安裝相關係統工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 2. 添加yum源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 3. 更新yum緩存
sudo yum makecache fast
# 4. 安裝
sudo yum -y install docker-ce
# 5. 啓動
sudo systemctl start docker
# 6. 查看docker操作命令
docker

3. windows

安裝docker toolbox:下載地址
docker toolbox包含:
在這裏插入圖片描述

第一章 需要了解的概念

  1. Docker:是開源的應用容器引擎,基於(Go語言)並遵從Apache2.0協議開源。Docker可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後發佈到任何流行的Linux機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口,更重要的是容器性能開銷極低。

  2. Docker容器優勢

    • 啓動快
    • 佔用資源少
  3. 鏡像:通過鏡像創建容器

  4. 倉庫:鏡像的集中存放地

  5. 容器
    在這裏插入圖片描述

  6. 沙箱機制

    • 沙箱是一個虛擬系統程序,沙箱提供的環境相對於每一個運行的程序都是獨立的,而且不會對現有的系統產生影響;
    • 沙箱具有非常良好的獨立性、隔離性,所以能夠搭建一些具有高風險的軟件進行測試;
    • 在沙箱裏面運行病毒可以說也是安全操作

第2章 基礎操作 - 鏡像

  1. 從倉庫獲取鏡像
    搜索鏡像:docker search image_name
    搜索結果過濾:
    • 是否是官方:docker search --filter "is-official=true" image_name
    • 是否是自動化構建:docker search --filter "is-automated=true" image_name
    • 大於多少顆星:docker search --filter stars=3 image_name
  2. 下載鏡像:docker pull image_name
  3. 本地鏡像的查看:docker images
  4. 本場鏡像的刪除:docker rmi image_name
# 以nginx爲例
# 1. 搜索鏡像
docker search nginx
# 1.1 結果過濾-是否是官方
docker search --filter "is-official=true" nginx
# 1.2 結果過濾-是否是自動化構建
docker search --filter "is-automated=true" nginx
# 1.3 結果過濾-大於等於3顆星
docker search --filter stars=3 nginx

# 2. 下載鏡像
docker pull nginx

# 3. 本地鏡像的查看
docker images

# 4. 本場鏡像的刪除
docker rmi nginx

第3章 基礎操作 - 容器

  1. 創建容器:docker run -itd --name=container_name image_name
    • -i:表示以交互模式運行容器;
    • -d:表示後臺運行容器,並返回容器ID;
    • -t:爲容器重新分配一個僞輸入終端;
    • --name:爲容器指定名稱
  2. 查看容器(運行中的):docker ps
  3. 查看容器(包括已停止的):docker ps -a`
  4. 停止容器:docker stop container_name/container_id
  5. 啓動容器:docker start container_name/container_id
  6. 重啓容器:docker restart container_name/container_id
  7. 刪除容器:docker rm container_name/container_id
# 以nginx爲例
# 1.創建一個容器
docker run -itd --name=nginx nginx

# 2. 查看運行的容器
docker ps 

# 3. 查看所有的容器
docker ps -a

# 4. 啓動容器
docker start nginx

# 5. 重啓容器
docker restart nginx

# 6. 停止容器
docker stop nginx

# 7. 刪除容器
docker rm nginx

第四章 容器的修改及保存

  1. 進入容器:docker exec -it container_name/container_id /bin/bash
  2. 退出容器:exit
  3. 提交修改:docker commit -a "author" -m "message" container_name/container_id new_image_name:tag_name
    • -a:參數可選,用於指定作者
    • -m:參數可選,提交信息,可以說明一下做了哪些修改
    • container_name/container_id:被修改容器的容器名和ID,只用寫一個就可以
    • new_image_name:此爲新鏡像的名字,可自定義
    • tag_name:引爲新鏡像的標籤,可不寫,不寫時默認爲latest
# 以nginx爲例
# 1. 進入nginx容器
docker exec -it nginx /bin/bash
# 2. 修改容器,增加一個目錄或文件後,退出
exit
# 3. 提交修改,生成新的鏡像
docker commit -a "px" -m "test_add_dir" nginx	new_nginx

第五章 容器進階操作

  1. 端口映射:docker run -itd -p 宿主機端口號:容器端口號
    爲何需要端口映射:客戶端是直接與宿主機進行通信,而不是直接與容器進行通信,容器是與宿主機進行通信,所以需要端口映射。
    ———————————————————————————————————————————————
    | ——————————————— 宿主機 |
    | | 容器 | |
    80<————>80 | |
    | | | |
    | ——————————————— |
    ———————————————————————————————————————————————

  2. 文件掛載
    docker run -itd -v /宿主機/文件目錄:/容器/目錄

  3. 將容器的文件複製到本地
    docker cp 容器名: /宿主機/文件目錄/文件名 /宿主機目錄/文件名

  4. 將本地的文件複製到容器
    docker cp /宿主機目錄/文件名 容器名: /宿主機/文件目錄/文件名

  5. 容器互聯
    docker run -itd --link 要關聯的容器的容器名字:容器在被關聯的容器中的別名

# 以nginx爲例
1. 端口映射:宿主機8888端口映射到容器的80端口 
docker run -itd --name=nginx -p 8888:80

2.將宿主機的 /User/panxiong/course/index.html文件掛載到容器的/usr/share/nginx/html/index.html
# 注:宿主機中修改index.html,容器中的對應的index.html也會修改
# 容器對index.html修改,本地對應的index.html也會修改
docker run -itd --name=nginx -v /User/panxiong/course/index.html:/usr/share/nginx/html/index.html

3. 將容器的文件複製到本地
docker cp nginx:/etc/nginx/conf.d/default.conf /Users/panxiong/course/default.conf

4. 將本地的文件複製到容器的根目錄下
docker cp /Users/panxiong/course/default.conf nginx:/default.conf 

5. 容器互聯,以mysql和php爲例
5.1 啓動mysql容器
docker run -itd --name=mysql -p 33066:3306 -v /Users/panxiong/course/mysql/:/var/lib/mysql/ -e MYSQL_ROOT_PASSWORD=123456 mysql
# -e:啓動容器的時候,往裏面傳遞參數,設置root密碼
5.2 進入mysql容器,修改root密碼
docker exec -it mysql /bin/bash
mysql -uroot -p
# 修改mysql密碼,修改root任意連接地址的密碼爲123456
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
exit
5.3 在本地連接容器的數據庫,添加一些數據

5.4 啓動php容器
創建一個index.php
<?php
pdo = new \PDO('mysql:host=mysql;dbname=test','root', '123456');
foreach($pdo->query('SELECT * from user) as $row)
	print_r($row);
}

docker run -itd --name=php --link mysql:mysql -v /Users/panxiong/course/php/index.php:/index.php

5.5 進入php容器
docker exec -it php /bin/bash

5.6 安裝pdo_mysql
docker-php-ext-install pdo_mysql

5.7 執行php index.php

修改mysql密碼,修改root任意連接地址的密碼爲123456
ALTER USER ‘root’@’%’ IDENTIFIED WITH mysql_native_ password BY ‘123456’;

第六章 Dockerfile

6.1 Dockerfile簡介

Dockerfile就是名爲Dockerfile的文件,文件中包含一些Linux命令,Docker通過讀取文件中的命令來組建鏡像。Dockerfile文件內容結構分四部分:基礎鏡像信息維護者信息鏡像操作指令容器啓動時執行指令

1. 運行Dockerfile
docker build -t image_name:tag_name .

2 通過-f參數來指定Dockerfile文件位置
docker build -f /path/Dockerfile .

6.2 命令詳解

  1. FROM:指定基礎鏡像,必須爲第一個命令

    1. 格式
    FROM <image>
    FROM <image>:<tag>
    FROM <image>@<digest>
    
    2.示例
    FROM centos:7.0 
    
  2. MAINTAINER:維護者信息

    1. 格式
    MAINTAINER <name>
    
    2. 示例
    MAINTAINER PanXiong
    
  3. RUN:構建鏡像時執行的命令

    1. 格式  
    RUN <command> exec 執行
    RUN ["executable", "param1", "param2"]
    
    2. 示例
    RUN ["/bin/executable", "param1", "param2"]
    RUN yum install nginx
    
  4. ADD:將本地文件添加到容器中

    tar類型文件會自動解壓(網絡壓縮資源不會被解壓),可以訪問網絡資源,類似wget
    
    1. 格式
    ADD <src> <dest>
    ADD ["<src>",... "<dest>"] # 用於支持包含空格的路徑
    
    2. 示例
    ADD tes* /mydir/ # 添加所有以“tes"開頭的文件
    ADD tes?.txt /mydir/   # ? 替代一個單字符,例如:"test.txt"
    ADD test relativeDir/  # 添加 "test" 到 `WORKDIR`/relativeDir/
    ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
    # 注:第一個參數指宿主機文件路徑,第二個參數指容器路徑
    
  5. COPY:功能類似ADD,但是是不會自動解壓文件,也不能訪問網絡資源

  6. CMD:構建容器後調用,也就是在容器啓動時才進行調用

    1. 格式
    CMD	["executable", "param1", "param2"] # 執行可執行文件, 優先
    CMD ["param1", "param2"] 	# (設置了ENTRYPOINT, 則直接調用ENTRY添加參數)
    CMD command param1 param2 	# (執行shell內部命令)
    2. 示例
    CMD echo "This is a test" | wc -
    CMD ["/usr/bin/wc", "--help"]
    注:CMD不同於RUN,CMD用於指定在容器啓動時所要執行的命令,而RUN用於指定鏡像構建時所要執行的命令。
    
  7. ENTRYPOINT:配置容器,使其可執行化。配合CMD可省去“application”,只使用參數

    1. 格式 
    ENTRYPOINT ["executable", "param1", "param2"] 	# (可執行文件,優先)
    ENTRYPOINT command param1 param2 				# (shell 內部命令)
    2. 示例:
    FROM ubuntu
    ENTRYPOINT ["top", "-b"]
    CMD ["-c"]
    注:ENTRYPOINT與CMD非常類似,不同提通過docker run執行的命令不會覆蓋ENTRYPOINT,而docker run 
    命令中指定的任何參數,都會被當做參數再次傳遞給ENTRYPOINT,Dockerifle中只允許有一個ENTRYPOINT命
    令,多指定時會覆蓋前面的設置,而只執行最後的ENTRYPOINT指令。
    docker run -itd --name=nginx nginx echo 'hello world'
    
  8. LABEL:用於爲鏡像添加元數據

    1. 格式
    LABEL <key>=<value> <key>=<value> ...
    
    2. 示例
    LABEL version="1.0" description="這是一個nginx鏡像”
    
    注:使用LABEL指定元數據時,一條LABEL指定可以指定一或多條元數據,指定多條元數據時不同元數據之間通過
    空格分隔。推薦將所有的元數據通過一條LABEL指令指定,以免生成過多的中間鏡像。
    
  9. ENV:設置環境變量

    1. 格式
    ENV <key> <value> 之後的所有內容均會被視爲其<value>的組成部分,因此,一次只能設置一個變量
    ENV <key>=<value> <key>=<value> ...可以設置多個變量,每個變量爲一個“<key>=<value>”的鍵值對,
    	如果<key>中包含空格,可以使用\來進行轉義,也可以通過“”來進行標示; 另外,反斜線也可以用於續行。
    
    2. 示例
    EVN myName John Doe
    EVN myDog Rex The Dog
    EVN myCat=fluffy
    
  10. EXPOSE:指定於外界交互的端口

    1. 格式
    EXPOSE <port>[<port>...]
    
    2. 示例
    EXPOSE 80 443
    EXPOSE 8080
    
    注:EXPOSE並不會讓容器的端口訪問到主機。要使其可訪問,需要在docker run運行容器時通過-p來發布這些
    	端口,或通過-P參數來發布EXPOSE導出的所有端口
    
  11. VOLUME:用於指定持久化目錄
    指定當前容器,哪些目錄可以用於掛載

    1. 格式
    VOLUME ["path/to/dir"]
    
    2. 示例
    VOLUME ["/data/"]
    VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
    
    注:一個卷可以存在於一個或多個容器的指定目錄,該目錄可以繞過聯合文件系統,並具有以下功能:
    	1. 卷可以容器間共享和重用
    	2. 容器並不一定要和其它容器共享卷
    	3. 修改卷後會立即生效
    	4. 對卷的修改不會對鏡像產生影響
    	5. 卷會一直存在,直到沒有任何容器在使用它
    
  12. WORKDIR:工作目錄,類似於cd命令

    1. 格式
    WORKDIR /path/to/workdir
    
    2. 示例
    WORKDIR /usr/local/ (這時工作目錄爲/usr/local/)
    WORKDIR nginx  		(這時工作目錄爲/usr/local/nginx)
    WORKDIR sbin  		(這時工作目錄爲/usr/local/nginx/sbin)
    
    注:通過WORKDIR設置工作目錄後,Dockerfile中其後的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令
    都會在該目錄下執行。在使用docker run運行容器時,可以通過`-w參數覆蓋構建時所設置的工作目錄`
  13. USER:指定運行容器時的用戶名或 UID,後續的 RUN 也會使用指定用戶
    使用USER指定用戶時,可以使用用戶名、UID或GID,或是兩者的組合。當服務不需要管理員權限時,可以通過該命令指定運行用戶。並且可以在之前創建所需要的用戶

    1. 格式
    USER user
    USER user:group
    USER uid
    USER uid:gid
    USER user:gid
    USER uid:group
    
    2. 示例
    USER www
    
    注:使用USER指定用戶後,Dockerfile中其後的命令RUN、CMD、ENTRYPOINT都將使用該用戶。
    鏡像構建完成後,通過docker run運行容器時,可以通過-u參數來覆蓋所指定的用戶。
    
  14. ARG:用於指定傳遞給構建運行時的變量
    Dockerfile文件裏面的變量

    1. 格式
     ARG <name>[=<default value>]
    
    2. 示例
     ARG site
     ARG build_user=www
    
  15. ONBUILD:用於設置鏡像觸發器

    1. 格式
     ONBUILD [INSTRUCTION]
    
    2. 示例
     ONBUILD [INSTRUCTION]
     ONBUILD RUN /usr/local/bin/python-build --dir /app/src
    
    注:當所構建的鏡像被用做其它鏡像的基礎鏡像,該鏡像中的觸發器將會被鑰觸發
    

6.3 完整Dockerfile例子

FROM registry.cn-hangzhou.aliyuncs.com/xwjs/centos7

MAINTAINER PanXiong

# Yum
RUN yum -y update && \
	yum install -y pcre pcre-devel zlib openssl openssl-devel && \
	yum clean all

ARG NGINX_VERSION=1.15.0

#Nginx
WORKDIR /tmp

RUN wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
	tar xzf nginx-${NGINX_VERSION}.tar.gz && \
	cd /tmp/nginx-${NGINX_VERSION}.tar.gz && \
	./configure \
		--prefix=/usr/local/nginx \
		--with-http_ssl_module \
		--with-http_sub_module \
		--with-http_dav_module \
		--with-http_flv_module \
		--with-http_gzip_static_module \
		--with-http_stub_status_module \
		--with-debug && \
	make && \
	make install

# 設置環境變量
ENV PATH /usr/local/nginx/sbin:$PATH

# 開放端口
EXPOSE 80 443

# 執行命令
ENTRYPOINT ["nginx", "-g", "daemon off;"]

第七章搭建PHP開發環境

還未整理。。。
啓動mysql
啓動php
啓動nginx
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

參考

源於視頻:筆記視頻

發佈了140 篇原創文章 · 獲贊 44 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章