第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包含:
第一章 需要了解的概念
-
Docker
:是開源的應用容器引擎,基於(Go語言
)並遵從Apache2.0協議開源。Docker
可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器
中,然後發佈到任何流行的Linux機器上,也可以實現虛擬化。容器
是完全使用沙箱機制
,相互之間不會有任何接口,更重要的是容器性能開銷極低。 -
Docker容器優勢
- 啓動快
- 佔用資源少
-
鏡像
:通過鏡像創建容器 -
倉庫
:鏡像的集中存放地 -
容器
:
-
沙箱機制
- 沙箱是一個虛擬系統程序,沙箱提供的環境相對於每一個運行的程序都是獨立的,而且不會對現有的系統產生影響;
- 沙箱具有非常良好的獨立性、隔離性,所以能夠搭建一些具有高風險的軟件進行測試;
- 在沙箱裏面運行病毒可以說也是安全操作
第2章 基礎操作 - 鏡像
- 從倉庫獲取鏡像
搜索鏡像: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
- 是否是官方:
- 下載鏡像:
docker pull image_name
- 本地鏡像的查看:
docker images
- 本場鏡像的刪除:
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章 基礎操作 - 容器
- 創建容器:
docker run -itd --name=container_name image_name
- -i:表示以交互模式運行容器;
- -d:表示後臺運行容器,並返回容器ID;
- -t:爲容器重新分配一個僞輸入終端;
- --name:爲容器指定名稱
- 查看容器(運行中的):
docker ps
- 查看容器(包括已停止的):docker ps -a`
- 停止容器:
docker stop container_name/container_id
- 啓動容器:
docker start container_name/container_id
- 重啓容器:
docker restart container_name/container_id
- 刪除容器:
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
第四章 容器的修改及保存
- 進入容器:
docker exec -it container_name/container_id /bin/bash
- 退出容器:
exit
- 提交修改:
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
第五章 容器進階操作
-
端口映射:docker run -itd -p 宿主機端口號:容器端口號
爲何需要端口映射:客戶端是直接與宿主機進行通信,而不是直接與容器進行通信,容器是與宿主機進行通信,所以需要端口映射。
———————————————————————————————————————————————
| ——————————————— 宿主機 |
| | 容器 | |
80<————>80 | |
| | | |
| ——————————————— |
——————————————————————————————————————————————— -
文件掛載
docker run -itd -v /宿主機/文件目錄:/容器/目錄 -
將容器的文件複製到本地
docker cp 容器名: /宿主機/文件目錄/文件名 /宿主機目錄/文件名 -
將本地的文件複製到容器
docker cp /宿主機目錄/文件名 容器名: /宿主機/文件目錄/文件名 -
容器互聯
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 命令詳解
-
FROM
:指定基礎鏡像,必須爲第一個命令1. 格式 FROM <image> FROM <image>:<tag> FROM <image>@<digest> 2.示例 FROM centos:7.0
-
MAINTAINER
:維護者信息1. 格式 MAINTAINER <name> 2. 示例 MAINTAINER PanXiong
-
RUN
:構建鏡像時執行的命令1. 格式 RUN <command> exec 執行 RUN ["executable", "param1", "param2"] 2. 示例 RUN ["/bin/executable", "param1", "param2"] RUN yum install nginx
-
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/ # 注:第一個參數指宿主機文件路徑,第二個參數指容器路徑
-
COPY
:功能類似ADD,但是是不會自動解壓文件,也不能訪問網絡資源 -
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用於指定鏡像構建時所要執行的命令。
-
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'
-
LABEL
:用於爲鏡像添加元數據1. 格式 LABEL <key>=<value> <key>=<value> ... 2. 示例 LABEL version="1.0" description="這是一個nginx鏡像” 注:使用LABEL指定元數據時,一條LABEL指定可以指定一或多條元數據,指定多條元數據時不同元數據之間通過 空格分隔。推薦將所有的元數據通過一條LABEL指令指定,以免生成過多的中間鏡像。
-
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
-
EXPOSE
:指定於外界交互的端口1. 格式 EXPOSE <port>[<port>...] 2. 示例 EXPOSE 80 443 EXPOSE 8080 注:EXPOSE並不會讓容器的端口訪問到主機。要使其可訪問,需要在docker run運行容器時通過-p來發布這些 端口,或通過-P參數來發布EXPOSE導出的所有端口
-
VOLUME
:用於指定持久化目錄
指定當前容器,哪些目錄可以用於掛載1. 格式 VOLUME ["path/to/dir"] 2. 示例 VOLUME ["/data/"] VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"] 注:一個卷可以存在於一個或多個容器的指定目錄,該目錄可以繞過聯合文件系統,並具有以下功能: 1. 卷可以容器間共享和重用 2. 容器並不一定要和其它容器共享卷 3. 修改卷後會立即生效 4. 對卷的修改不會對鏡像產生影響 5. 卷會一直存在,直到沒有任何容器在使用它
-
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參數覆蓋構建時所設置的工作目錄`。
-
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參數來覆蓋所指定的用戶。
-
ARG
:用於指定傳遞給構建運行時的變量
Dockerfile文件裏面的變量1. 格式 ARG <name>[=<default value>] 2. 示例 ARG site ARG build_user=www
-
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
參考
源於視頻:筆記視頻