Docker 介紹和安裝
Docker 安裝:
1.windows安裝:
1.安裝 docker toolbox
2.docker toolbox包含:
Docker CLI: 客戶端,用來運(yùn)行docker引擎鏡像和容器
Docker Machine:可以讓你在windows的命令行中運(yùn)行docker引擎命令
DOcker Compose:用來運(yùn)行docker-compose命令
Kitematic :這是Docker的GUI版本
DOcker QuickStart shell:這是一個(gè)已經(jīng)配置好的Docker命令行環(huán)境
Oracle VM Virtualbox:虛擬機(jī)
3.下載客戶端
docker tools:
http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/
docker for Windows
https://www.cnblogs.com/wyt007/p/10656813.html
https://blog.csdn.net/qq_16525279/article/details/98970008
2.Mac OS安裝:
1.Homebrew 安裝,安裝命令: brew cask install docker
2.下載客戶端:
3.CentOS安裝:
1.Centos7以上要求系統(tǒng)為:64位,內(nèi)核版本高于 3.10
2.Centos6.5以上要求系統(tǒng):64位,內(nèi)核版本高于 2.6.32
3.可以通過 yum 安裝:
//安裝相關(guān)系統(tǒng)工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
//添加 yum 源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
//更新 yum 緩存
sudo yum makecache fast
//安裝
sudo yum -y install docker-ce
//啟動(dòng)
sudo systemctl start docker
// 查看 docker 操作命令
docker
4.Ubuntu安裝
官網(wǎng)地址: https://docs.docker.com/install/linux/docker-ce/ubuntu/
0. 卸載舊版本
sudo apt-get remove docker docker-engine docker.io containerd runc
1. 更新apt:
sudo apt-get update
2. 添加證書安裝包以允許apt通過HTTPS:
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
3. 添加Docker的官方GPG密鑰:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
4. 添加倉庫筐带。
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
5. 安裝docker ce
sudo apt-get install docker-ce docker-ce-cli containerd.io
6. 測(cè)試
sudo docker run hello-world
7. 添加當(dāng)前用戶到 docker 用戶組
sudo usermod -aG docker pyvip
Docker概念
什么是沙箱機(jī)制?
1.沙箱是一個(gè)虛擬系統(tǒng)程序,沙箱提供的環(huán)境相對(duì)于每一個(gè)運(yùn)行程序都是獨(dú)立的虹钮,而且不會(huì)對(duì)現(xiàn)有的系統(tǒng)產(chǎn)生影響
2.沙箱具有非常良好的獨(dú)立性诉儒,隔離性反症,所以能夠搭建一些具有高風(fēng)險(xiǎn)的軟件進(jìn)行測(cè)試
3.在沙箱里面運(yùn)行病毒可以說是 安全的操作
沙箱 | 沙箱 | 沙箱 | |
Docker是什么栓拜?
Docker 是一個(gè)開源的應(yīng)用容器引擎,基于GO語音并遵從Apache2.0協(xié)議開源
DOcker 可以讓開發(fā)者打包他們應(yīng)用以及依賴包到一個(gè)輕量級(jí)狼纬、可移植性的 容器 中晋柱,讓后發(fā)布到任何流行的 Linux機(jī)器上砸讳,也可以實(shí)現(xiàn)虛擬化
容器: 是完全使用 沙箱機(jī)制琢融,互相之間不會(huì)有任何接口(類似IPhone的 app),更重要的是 容器性能開銷極低
容器-虛擬機(jī):
容器 | 容器 | 容器 |
Docker容器優(yōu)勢(shì):
1.啟動(dòng)快 2.占用資源少
鏡像:
1.通過鏡像創(chuàng)建容器 2.光盤、裝系統(tǒng) 3.進(jìn)行里面的內(nèi)容
倉庫:
鏡像的集中存放地
基本操作-鏡像
1.從倉庫獲取鏡像
搜索鏡像: docker search image_name
搜索結(jié)果過濾:
是否官方: docker search --filter "is-official=true" image_name
是否自動(dòng)化構(gòu)建: docker search --filter "is-automated=true" image_name
大于多少顆星: docker search --filter stars=3 image_name
下載鏡像: docker search pull image_name
2.本地鏡像查看: docker images
3.本地鏡像刪除: docker rmi image_name
基本操作-容器
1.創(chuàng)建容器 : docker run -itd --name=container_name container
-i : 表示以交互模式運(yùn)行容器
-d : 表示后臺(tái)運(yùn)行容器,并返回容器ID
-t : 為容器重新分配一個(gè)偽輸入終端
--name: 為容器指定名稱
2.查看容器(運(yùn)行中的):docker ps
3.查看容器(包括已停止的):docker pa -a
4.停止容器:docker stop container_name | container_id
5.重啟容器:docker restart container_name | container_id
6.刪除容器:docker rm container_name | container_id
容器的修改和保持
1.進(jìn)入容器 : docker exec -it container_name | container_id /bin/bash
2.退出容器 : exit
3.提交修改(保存) :
docker commit -a "author" -m "message" container_id | container_name new_image_name:tag_name
參數(shù)說明:
-a:參數(shù)可選,用于指定作者,可以寫你的名字
-m:參數(shù)可選,提交信息,可以說一下你做了哪些修改
container_id:該參數(shù)為被修改的容器ID
new_image_name:此為新的鏡像的名字,可自定義
tag_name:此為新鏡像的標(biāo)簽,可不寫,不寫時(shí)標(biāo)簽?zāi)J(rèn)為latest
容器操作進(jìn)階
端口映射:
docker run -itd -p 宿主機(jī)端口號(hào):容器端口號(hào)
-----------------------------------------
| 宿主機(jī) |
| | ----- | |
80 <-----> 80 容器 | |
| | ----- | |
| |
-----------------------------------------
文件掛載:
docker run -itd -p 宿主機(jī)端口號(hào):容器端口號(hào) -v /宿主機(jī)/文件目錄/文件名:/容器/目錄/文件名 container_name
例如:
docker run -itd -p 宿主機(jī)端口號(hào):容器端口號(hào) -v 指定本地目錄的文件路徑:被掛載的文件路徑 container_name
將容器的文件復(fù)制到本地:
docker cp 容器名:/容器目錄/文件名 /宿主機(jī)目錄/文件名
將本地的文件復(fù)制到容器:
docker cp /宿主機(jī)目錄/文件名 容器名:/容器目錄/文件名
容器互聯(lián):
docker run -itd --name=container_name --link 要關(guān)聯(lián)的容器名字:容器在被關(guān)聯(lián)的容器中的別名 -v /宿主機(jī)/文件目錄/文件名:/容器/目錄/文件名 container_name
修改 mysql 密碼:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
Dockerfile
什么是 Dockerfile
Dockerfile 就是名為 Dockerfile 的文件,文件中包含一些 Linux 命令, Docker 通過讀取文件中的命令來組建鏡像
Dockerfile 一般分為四部分:
基礎(chǔ)鏡像信息簿寂、維護(hù)者信息漾抬、鏡像操作指令、容器啟東市執(zhí)行指令, "#" 為Dockerfile 中的注釋;
運(yùn)行Dockerfile
運(yùn)行Dockerfile: docker build -t image_name:tag_name .
也可以通過 -f 參數(shù)來指定 Dockerfile 文件位置: docker build -f /path/Dockerfile
命令詳解:
FORM:指定基礎(chǔ)鏡像,必須為第一個(gè)命令
格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
實(shí)例:
FROM centos:7.0
MAINTAINER:維護(hù)者信息
格式:
MAINTAINER <name>
實(shí)例:
MAINTAINER hakcers
RUN:構(gòu)建鏡像時(shí)執(zhí)行的命令:
格式:
RUN <command>*exec執(zhí)行*
格式:
RUN ["executable","param1","param2"]
實(shí)例:
RUM ["/bin/executable","param1","param2"]
RUM yum install nginx
ADD:將本地文件添加到容器中,tar 類型文件會(huì)自動(dòng)解壓(網(wǎng)絡(luò)壓縮資源不會(huì)別解壓),可以房屋網(wǎng)絡(luò)資源,類似wget
格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] 用于支持包含空格的路徑
實(shí)例:
ADD test* /mydir/ # 添加所有以 "test" 開頭的文件
ADD tes?.txt /mydir/ # ? 替代一個(gè)單字符,例如:"test.txt"
ADD test relativeDir/ # 添加 "test" 到 WORKDIR/
relativeDir
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir
注:第一個(gè)參數(shù)指 宿主機(jī)文件路徑,第二個(gè)參數(shù)指容器路徑
COPY:功能類似 ADD, 但是 不會(huì)自動(dòng)解壓文件,也不能訪問網(wǎng)絡(luò)資源
CMD:構(gòu)建容器后調(diào)用,也就是在容器中啟動(dòng)時(shí)才進(jìn)行調(diào)用
格式:
CMD ["executable","param1","param2" ] (執(zhí)行可執(zhí)行文件,優(yōu)秀)
CMD ["param1","param2"] (設(shè)置ENTRYPOINT,則直接調(diào)用 ENTRYPOINT添加參數(shù))
CMD command param1 param2 (執(zhí)行shell內(nèi)部命令)
實(shí)例:
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc",--help]
注:
CMD 不同于RUN,CMD用于指定在容器啟動(dòng)時(shí)所要的執(zhí)行命令,而RUN用于指定鏡像構(gòu)建時(shí)所要的執(zhí)行命令
ENTRYPOINT 配置容器,使其可執(zhí)行化常遂。配合CMD 可省去 "application",只使用參數(shù)
格式:
ENTRYPOINT ["executable","param1","param2"] (可執(zhí)行文件,優(yōu)秀)
ENTRYPOINT command param1 param2 (shell內(nèi)部命令)
實(shí)例:
FROM Ubuntu
ENTRYPOINT ["top","-b"]
注:
ENTRYPOINT與CMD非常類似,不同的是通過docker run 執(zhí)行的命令不會(huì)覆蓋ENTRYPOINT,而 docker run 命令中指定的任何參數(shù),都會(huì)被當(dāng)做參數(shù)再次傳遞給 ENTRYPOINT纳令。Dockerfile 中只允許有一個(gè)ENTRYPOINT命令,多指定時(shí)會(huì)覆蓋前面的設(shè)置,而只執(zhí)行最后的ENTRYPOINT指令
docker run -itd --name=nginx nginx echo 'hello word'
LABEL:用于為鏡像添加元數(shù)據(jù)
格式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
實(shí)例:
LABEL version="1.0" description="這是一個(gè)nginx鏡像"
注:
使用LABEL指定元數(shù)據(jù)時(shí),一條LABEL指定可以 指定 一 或 多條元數(shù)據(jù),指定多條元數(shù)據(jù)時(shí)不同元數(shù)據(jù)之間通過空格分隔,推薦將所有的元數(shù)據(jù) 通過一條LABEL指令指定,以免生產(chǎn)過多的中間鏡像
ENV: 設(shè)置環(huán)境變量
格式:
ENV <key><value> #<key> 之后的所有內(nèi)容均被視為其<value>的組成部分,因此,一次只能設(shè)置一個(gè)變量
ENV <key><value>... #可以設(shè)置多個(gè)變量,每個(gè)變量為一個(gè)"<key>"=<value>的鍵值對(duì),如果<key>中包含空格,可以使用\來進(jìn)行轉(zhuǎn)義,也可以通過""來進(jìn)行標(biāo)示;另外,反斜線也可以用于續(xù)行
實(shí)例:
ENV myName Join Done
ENV myDOG REx The Dog
ENV myCat=fluffy
EXPOSE:指定外界交互的端口
格式:
EXPOSE <port> [<port>...]
實(shí)例:
EXPOSE 80 443
EXPOSE 8080
注:
EXPOSE 并不會(huì)讓容器的端口訪問到主機(jī),要使其可訪問,需要在 docker run 運(yùn)行容器時(shí)通過 -p 來發(fā)不這些端口,或通過 -p 參數(shù)來發(fā)布 EXPOSE 導(dǎo)出所有的端口
VOLUME:用于指定持久化目錄
格式:
VOLLME ["/path/to/dir"]
實(shí)例:
VOLLME ["/data"]
VOLLME ["/var/www","/var/log/apache2","/etc/apache2"]
注:
一個(gè)卷可以存在一個(gè)或多個(gè)容器的指定目錄,該目錄可以繞過聯(lián)合文件系統(tǒng),并具有以下功能:
1.卷可容器間共享和重用
2.容器并不一定和其他容器共享卷
3.修改卷后會(huì)立即生效
4.對(duì)卷的修改不會(huì)對(duì)鏡像產(chǎn)生影響
5.卷會(huì)一直存在,知道沒有任何容器在使用它
WORKDIR:工作目錄,類似 cd 命令
格式:
WORKDIR /usr/local (這時(shí)工作目錄為 /usr/local/)
WORKDIR nginx (這時(shí)工作目錄為 /usr/local/nginx)
WORKDIR nginx (這是工作目錄為 /usr/local/nginx/sbin)
注:
通過WORKDIR 設(shè)置工作目錄后,Dockerfile中其后的RUN、CMD克胳、ENTRYPOINT泊碑、ADD、COPY等 命令都會(huì)在該目錄下執(zhí)行毯欣。在使用 dockerrun 運(yùn)行容器時(shí),可以通過 -w 參數(shù)覆蓋構(gòu)建時(shí)的工作目錄
USER:指定運(yùn)行容器時(shí)的用戶名或者 UID馒过,后續(xù)的RUN也會(huì)使用指定的用戶,使用USER指定用戶時(shí),可以使用用戶名酗钞、UID或 GID腹忽,或 兩者的組合来累。當(dāng)服務(wù)不需要管理員權(quán)限時(shí),可以通過該命令指定運(yùn)行用戶窘奏。并且可以在之前創(chuàng)建所有的用戶
格式:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
實(shí)例:
USER www
注:
使用 USER 指定用戶后嘹锁,Dockerfile 中其后的命令 RUN、CMD着裹、ENTRYPOINT 都將使用該用戶领猾。鏡像構(gòu)建完成后,通過docker run 運(yùn)行容器時(shí),可以通過 -u 參數(shù)來覆蓋指定用戶
ARG:用于指定傳遞給構(gòu)建運(yùn)行時(shí)的變量
格式:
ARG <name>[=<default value]
實(shí)例:
ARG site
ARG build_user=www
ONBUILD:用于設(shè)置鏡像觸發(fā)器
格式:
ONBUILD [INSTRUCTION]
實(shí)例:
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
注:
當(dāng)所構(gòu)建的鏡像被用做其它鏡像的基礎(chǔ)鏡像,該鏡像中的觸發(fā)器將會(huì)被觸發(fā)
搭建 PHP 開發(fā)環(huán)境
1.下載 nginx 骇扇、php:7.0-fpm摔竿、mysql 鏡像
2.啟動(dòng) mysql 容器:
docker run -itd -v /宿主機(jī)/目錄/mysql:/var/lib/mysql -p 33066:3306 --name=mysql -e MYSQL_ROOT_PASSWORD mpassword mysql
說明:
-v: 表示掛載
-e: 表示往后 添加參數(shù)
3.啟動(dòng) php 容器:
docker run -itd --link mysql:mysql -v /宿主機(jī)/代碼/目錄/:var/www/html --name=php php
4.啟動(dòng) nginx 容器:
docker run -itd -p 宿主機(jī)端口號(hào):容器端口號(hào) -v /宿主機(jī)/代碼/目錄/:/var/www/html --link php:php --name=nginx nginx