|
1.什么是docker: docker翻譯為搬運(yùn)工,在這里應(yīng)該可以理解為搬運(yùn)應(yīng)用的工具,也就是云.先了解其運(yùn)用場景之后更容易對他形成深刻理解. Docker提供了一種可移植的配置標(biāo)準(zhǔn)化機(jī)制,允許你一致性地在不同的機(jī)器上運(yùn)行同一個(gè)Container;而LXC本身可能因?yàn)椴煌瑱C(jī)器的不同配置而無法方便地移植運(yùn)行; Docker以App為中心,為應(yīng)用的部署做了很多優(yōu)化,而LXC的幫助腳本主要是聚焦于如何機(jī)器啟動(dòng)地更快和耗更少的內(nèi)存; Docker為App提供了一種自動(dòng)化構(gòu)建機(jī)制(Dockerfile),包括打包,基礎(chǔ)設(shè)施依賴管理和安裝等等; Docker提供了一種類似git的Container版本化的機(jī)制,允許你對你創(chuàng)建過的容器進(jìn)行版本管理,依靠這種機(jī)制,你還可以下載別人創(chuàng)建的Container,甚至像git那樣進(jìn)行合并; Docker Container是可重用的,依賴于版本化機(jī)制,你很容易重用別人的Container(叫Image),作為基礎(chǔ)版本進(jìn)行擴(kuò)展; Docker Container是可共享的,有點(diǎn)類似github一樣,Docker有自己的INDEX,你可以創(chuàng)建自己的Docker用戶并上傳和下載Docker Image; Docker提供了很多的工具鏈,形成了一個(gè)生態(tài)系統(tǒng);這些工具的目標(biāo)是自動(dòng)化、個(gè)性化和集成化,包括對PAAS平臺(tái)的支持等;
docker運(yùn)用場景: web應(yīng)用的自動(dòng)化打包和發(fā)布; 自動(dòng)化測試和持續(xù)集成、發(fā)布; 在服務(wù)型環(huán)境中部署和調(diào)整數(shù)據(jù)庫或其他的后臺(tái)應(yīng)用; 從頭編譯或者擴(kuò)展現(xiàn)有的OpenShift或Cloud Foundry平臺(tái)來搭建自己的PaaS環(huán)境。 可以看出來docker其實(shí)就是使得部署,發(fā)布變得更加快捷,更加自動(dòng)化,且適應(yīng)云平臺(tái)環(huán)境.再看定義: Docker是一個(gè)開源的引擎,可以輕松的為任何應(yīng)用創(chuàng)建一個(gè)輕量級(jí)的、可移植的、自給自足的容器。開發(fā)者在筆記本上編譯測試通過的容器可以批量地在生產(chǎn)環(huán)境中部署,包括VMs(虛擬機(jī))、bare metal、 OpenStack 集群和其他的基礎(chǔ)應(yīng)用平臺(tái)。 意思很明顯了.按照我的理解,先不考慮docker的實(shí)現(xiàn)方式,其實(shí)docker就是一個(gè)包含運(yùn)行環(huán)境的應(yīng)用,由于自身帶有所有需要的運(yùn)行環(huán)境促成了他的可移植性和快速部署. docker應(yīng)用環(huán)境的集成是通過一層一層的鏡像疊加實(shí)現(xiàn)的,這種方式可以使得底層鏡像多次復(fù)用,結(jié)構(gòu)清晰.這里不贅述docker的具體實(shí)現(xiàn)原理,實(shí)戰(zhàn)過后想來都會(huì)有一些理解. 2.docker安裝 不同的linux系統(tǒng)安裝docker會(huì)有些許不同,新版的redhat和centos7自帶有docker包,直接安裝即可.具體參考:docker安裝
ubuntu14.04 docker: $ sudo apt-get update
安裝所有必須和可選的包 $ sudo apt-get install linux-image-generic-lts-trusty 重啟系統(tǒng) $ sudo reboot
查看你是否安裝了wget $ which wget 如果wget沒有安裝,先升級(jí)包管理器,然后再安裝它。 $ sudo apt-get update $ sudo apt-get install wget 獲取最新版本的 Docker 安裝包 $ wget -qO- https://get.docker.com/ | sh 系統(tǒng)會(huì)提示你輸入sudo密碼,輸入完成之后,就會(huì)下載腳本并且安裝Docker及依賴包。 驗(yàn)證 Docker 是否被正確的安裝 $ sudo docker run hello-world
上邊的命令會(huì)下載一個(gè)測試鏡像,并在容器內(nèi)運(yùn)行這個(gè)鏡像。 ###########################正常情況下以下內(nèi)容可以不看###################################### 這部分主要介紹了 Docker 的可選配置項(xiàng),使用這些配置能夠讓 Docker 在 Ubuntu 上更好的工作。 創(chuàng)建 Docker 用戶組 docker 進(jìn)程通過監(jiān)聽一個(gè) Unix Socket 來替代 TCP 端口。在默認(rèn)情況下,docker 的 Unix Socket屬于root用戶,當(dāng)然其他用戶可以使用sudo方式來訪問。因?yàn)檫@個(gè)原因, docker 進(jìn)程就一直是root用戶運(yùn)行的。 為了在使用 docker 命令的時(shí)候前邊不再加sudo,我們需要?jiǎng)?chuàng)建一個(gè)叫 docker 的用戶組,并且為用戶組添加用戶。然后在 docker 進(jìn)程啟動(dòng)的時(shí)候,我們的 docker 群組有了 Unix Socket 的所有權(quán),可以對 Socket 文件進(jìn)行讀寫。 注意:docker 群組就相當(dāng)于root用戶。有關(guān)系統(tǒng)安全影響的細(xì)節(jié),請查看 Docker 進(jìn)程表面攻擊細(xì)節(jié) 使用具有sudo權(quán)限的用戶來登錄你的Ubuntu。 在這過程中,我們假設(shè)你已經(jīng)登錄了Ubuntu。 創(chuàng)建 docker 用戶組并添加用戶。 $ sudo usermod -aG docker ubuntu
注銷登錄并重新登錄 這里要確保你運(yùn)行用戶的權(quán)限。 驗(yàn)證 docker 用戶不使用 sudo 命令開執(zhí)行 Docker $ docker run hello-world 調(diào)整內(nèi)存和交換空間(swap accounting) 當(dāng)我們使用 Docker 運(yùn)行一個(gè)鏡像的時(shí)候,我們可能會(huì)看到如下的信息提示:
WARNING: Your kernel does not support cgroup swap limit. WARNING: Your kernel does not support swap limit capabilities. Limitation discarded. 為了防止以上錯(cuò)誤信息提示的出現(xiàn),我們需要在系統(tǒng)中啟用內(nèi)存和交換空間。我們需要修改系統(tǒng)的 GUN GRUB (GNU GRand Unified Bootloader) 來啟用內(nèi)存和交換空間。開啟方法如下: 使用具有sudo權(quán)限的用戶來登錄你的Ubuntu。 編輯 /etc/default/grub 文件 設(shè)置 GRUB_CMDLINE_LINUX 的值如下: GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1" 保存和關(guān)閉文件 更新 GRUB $ sudo update-grub
重啟你的系統(tǒng)。 允許UFW端口轉(zhuǎn)發(fā) 當(dāng)你在運(yùn)行 docker 的宿主主機(jī)上使用UFW(簡單的防火墻)。你需要做一些額外的配置。Docker 使用橋接的方式來管理網(wǎng)絡(luò)。默認(rèn)情況下,UFW 過濾所有的端口轉(zhuǎn)發(fā)策略。因此,當(dāng)在UFW啟用的情況下使用 docker ,你必須適當(dāng)?shù)脑O(shè)置UFW的端口轉(zhuǎn)發(fā)策略。 默認(rèn)情況下UFW是過濾掉所有的入站規(guī)則。如果其他的主機(jī)能夠訪問你的容器。你需要允許Docker的默認(rèn)端口(2375)的所有連接。 設(shè)置 UFW 允許Docker 端口的入站規(guī)則: 使用具有sudo權(quán)限的用戶來登錄你的Ubuntu。 $ sudo ufw status
打開和編輯/etc/default/ufw文件 $ sudo nano /etc/default/ufw
設(shè)置 DEFAULT_FORWARD_POLICY 如下: DEFAULT_FORWARD_POLICY="ACCEPT" 保存關(guān)閉文件。 重新加載UFW來使新規(guī)則生效。 $ sudo ufw reload
允許 Docker 端口的入站規(guī)則 $ sudo ufw allow 2375/tcp Docker 配置 DNS 服務(wù) 無論是Ubuntu還是Ubuntu 桌面繁衍版在系統(tǒng)運(yùn)行的時(shí)候都是使用/etc/resolv.conf配置文件中的127.0.0.1作為域名服務(wù)器(nameserver)。NetworkManager設(shè)置dnsmasq使用真實(shí)的dns服務(wù)器連接,并且設(shè)置 /etc/resolv.conf的域名服務(wù)為127.0.0.1。 在桌面環(huán)境下使用這些配置來運(yùn)行 docker 容器的時(shí)候, Docker 用戶會(huì)看到如下的警告: WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : [8.8.8.8 8.8.4.4] 該警告是因?yàn)?Docker 容器不能使用本地的DNS服務(wù)。相反 Docker 使用一個(gè)默認(rèn)的外部域名服務(wù)器。 為了避免此警告,你可以給 Docker 容器指定一個(gè)DNS服務(wù)器。或者你可以禁用 NetworkManager 的 dnsmasq。不過當(dāng)禁止 dnsmasq 可能使某些網(wǎng)絡(luò)的DNS解析速度變慢。 為 Docker 指定一個(gè)DNS服務(wù)器 使用具有sudo權(quán)限的用戶來登錄你的Ubuntu。 打開并編輯 /etc/default/docker $ sudo nano /etc/default/docker
添加設(shè)置 DOCKER_OPTS="--dns 8.8.8.8" 使用8.8.8.8替換如192.168.1.1的本地DNS服務(wù)器。你可以指定多個(gè)DNS服務(wù)器,多個(gè)DNS服務(wù)器使用空格分割例如 --dns 8.8.8.8 --dns 192.168.1.1 警告:如果你正在使用的電腦需要連接到不同的網(wǎng)絡(luò),一定要選擇一個(gè)公共DNS服務(wù)器。 重啟 Docker 進(jìn)程 $ sudo restart docker
或者,作為替代先前的操作過程,禁止NetworkManager中的dnsmasq(這樣會(huì)使你的網(wǎng)絡(luò)變慢) 打開和編輯 /etc/default/docker $ sudo nano /etc/NetworkManager/NetworkManager.conf
注釋掉 dns = dsnmasq: 保存關(guān)閉文件 重啟NetworkManager 和 Docker $ sudo restart network-manager $ sudo restart docker 升級(jí)Docker 在wget的時(shí)候使用-N參數(shù)來安裝最新版本的Docker: $ wget -N https://get.docker.com/ | sh ###########################正常情況下以上內(nèi)容可以不看###################################### 下載鏡像 首先,訪問 Docker 中文網(wǎng),在首頁中搜索名為“centos”的鏡像,在搜索的結(jié)果中,有一個(gè)“官方鏡像”,它就是我們所需的。 然后,進(jìn)入 CentOS 官方鏡像頁面,在“Pull this repository”輸入框中,有一段命令,把它復(fù)制下來,在自己的命令行上運(yùn)行該命令,隨后將立即下載該鏡像。 查看本地所有的鏡像: docker images 當(dāng)下載完成后,您應(yīng)該會(huì)看到: REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE docker.cn/docker/centos centos6 25c5298b1a36 7 weeks ago 215.8 MB 如果看到以上輸出,說明您可以使用“docker.cn/docker/centos”這個(gè)鏡像了,或?qū)⑵浞Q為倉庫(Repository),該鏡像有一個(gè)名為“centos6”的標(biāo)簽(Tag),此外還有一個(gè)名為“25c5298b1a36 ”的鏡像 ID(可能您所看到的鏡像 ID 與此處的不一致,那是正?,F(xiàn)象,因?yàn)檫@個(gè)數(shù)字是隨機(jī)生成的)。此外,我們可以看到該鏡像只有 215.8 MB,非常小巧,而不像虛擬機(jī)的鏡像文件那樣龐大。 現(xiàn)在鏡像已經(jīng)有了,我們下面就需要使用該鏡像,來啟動(dòng)容器。 啟動(dòng)容器 只需使用以下命令即可啟動(dòng)容器: docker run -i -t -v /root/software/:/mnt/software/ 25c5298b1a36 /bin/bash 這條命令比較長,我們稍微分解一下,其實(shí)包含以下三個(gè)部分: docker run <相關(guān)參數(shù)> <鏡像 ID> <初始命令> -i:表示以“交互模式”運(yùn)行容器 需要說明的是,不一定要使用“鏡像 ID”,也可以使用“倉庫名:標(biāo)簽名”,例如:docker.cn/docker/centos:centos6。 初始命令表示一旦容器啟動(dòng),需要運(yùn)行的命令,此時(shí)使用“/bin/bash”,表示什么也不做,只需進(jìn)入命令行即可。 安裝相關(guān)軟件 為了搭建 Java Web 運(yùn)行環(huán)境,我們需要安裝 JDK 與 Tomcat,下面的過程均在容器內(nèi)部進(jìn)行。我們不妨選擇/opt/目錄作為安裝目錄,首先需要通過cd /opt/命令進(jìn)入該目錄 安裝 JDK 首先,解壓 JDK 程序包: tar -zxf /mnt/software/jdk-7u67-linux-x64.tar.gz -C . 然后,重命名 JDK 目錄: mv jdk1.7.0_67/ jdk/ 安裝 Tomcat 首先,解壓 Tomcat 程序包: tar -zxf /mnt/software/apache-tomcat-7.0.55.tar.gz -C . 然后,重命名 Tomcat 目錄: mv apache-tomcat-7.0.55/ tomcat/ 設(shè)置環(huán)境變量 首先,編輯.bashrc文件 vi ~/.bashrc
然后,在該文件末尾添加如下配置: export JAVA_HOME=/opt/jdk export PATH=$PATH:$JAVA_HOME 最后,需要使用source命令,讓環(huán)境變量生效: source ~/.bashrc 編寫運(yùn)行腳本 我們需要編寫一個(gè)運(yùn)行腳本,當(dāng)啟動(dòng)容器時(shí),運(yùn)行該腳本,啟動(dòng) Tomcat,具體過程如下: 首先,創(chuàng)建運(yùn)行腳本: vi /root/run.sh 然后,編輯腳本內(nèi)容如下: #!/bin/bash source ~/.bashrc sh /opt/tomcat/bin/catalina.sh run 注意:這里必須先加載環(huán)境變量,然后使用 Tomcat 的運(yùn)行腳本來啟動(dòng) Tomcat 服務(wù)。 最后,為運(yùn)行腳本添加執(zhí)行權(quán)限: chmod u+x /root/run.sh 退出容器 當(dāng)以上步驟全部完成后,可使用exit命令,退出容器。 隨后,可使用如下命令查看正在運(yùn)行的容器: docker ps
此時(shí),您應(yīng)該看不到任何正在運(yùn)行的程序,因?yàn)閯偛乓呀?jīng)使用exit命令退出的容器,此時(shí)容器處于停止?fàn)顟B(tài),可使用如下命令查看所有容器: docker ps -a
輸出如下內(nèi)容: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 57c312bbaad1 docker.cn/docker/centos:centos6 "/bin/bash" 27 minutes ago Exited (0) 19 seconds ago naughty_goldstine 記住以上CONTAINER ID(容器 ID),隨后我們將通過該容器,創(chuàng)建一個(gè)可運(yùn)行 Java Web 的鏡像。 創(chuàng)建 Java Web 鏡像 使用以下命令,根據(jù)某個(gè)“容器 ID”來創(chuàng)建一個(gè)新的“鏡像”: docker commit 57c312bbaad1 javaweb:0.1
該容器的 ID 是“57c312bbaad1”,所創(chuàng)建的鏡像名是“javaweb:0.1”,隨后可使用鏡像來啟動(dòng) Java Web 容器。 啟動(dòng) Java Web 容器 有必要首先使用docker images命令,查看當(dāng)前所有的鏡像: REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE javaweb 0.1 fc826a4706af 38 seconds ago 562.8 MB docker.cn/docker/centos centos6 25c5298b1a36 7 weeks ago 215.8 MB 可見,此時(shí)已經(jīng)看到了最新創(chuàng)建的鏡像“javaweb:0.1”,其鏡像 ID 是“fc826a4706af”。正如上面所描述的那樣,我們可以通過“鏡像名”或“鏡像 ID”來啟動(dòng)容器,與上次啟動(dòng)容器不同的是,我們現(xiàn)在不再進(jìn)入容器的命令行,而是直接啟動(dòng)容器內(nèi)部的 Tomcat 服務(wù)。此時(shí),需要使用以下命令: docker run -d -p 58080:8080 --name javaweb javaweb:0.1 /root/run.sh 稍作解釋: -d:表示以“守護(hù)模式”執(zhí)行/root/run.sh腳本,此時(shí) Tomcat 控制臺(tái)不會(huì)出現(xiàn)在輸出終端上。 當(dāng)運(yùn)行以上命令后,會(huì)立即輸出一長串“容器 ID”,我們可通過docker ps命令來查看當(dāng)前正在運(yùn)行的容器。 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 82f47923f926 javaweb:0.1 "/root/run.sh" 4 seconds ago Up 3 seconds 0.0.0.0:58080->8080/tcp javaweb 在瀏覽器中,輸入以下地址,即可訪問 Tomcat 首頁: ###########################安裝鏡像方法二##################################### #####dockerfile語法###### Dockerfile關(guān)鍵字 # CommentINSTRUCTION arguments FROM 基于哪個(gè)鏡像 RUN 安裝軟件用 MAINTAINER 鏡像創(chuàng)建者 CMD container啟動(dòng)時(shí)執(zhí)行的命令,但是一個(gè)Dockerfile中只能有一條CMD命令,多條則只執(zhí)行最后一條CMD. CMD主要用于container時(shí)啟動(dòng)指定的服務(wù),當(dāng)docker run command的命令匹配到CMD command時(shí),會(huì)替換CMD執(zhí)行的命令。如: Dockerfile: CMD echo hello world 運(yùn)行一下試試: edwardsbean@ed-pc:~/software/docker-image/centos-add-test$ docker run centos-cmd hello world 一旦命令匹配: edwardsbean@ed-pc:~/software/docker-image/centos-add-test$ docker run centos-cmd echo hello edwardsbean hello edwardsbean ENTRYPOINT container啟動(dòng)時(shí)執(zhí)行的命令,但是一個(gè)Dockerfile中只能有一條ENTRYPOINT命令,如果多條,則只執(zhí)行最后一條 ENTRYPOINT沒有CMD的可替換特性 USER 使用哪個(gè)用戶跑container 如: ENTRYPOINT ["memcached"] USER daemon EXPOSE container內(nèi)部服務(wù)開啟的端口。主機(jī)上要用還得在啟動(dòng)container時(shí),做host-container的端口映射: docker run -d -p 127.0.0.1:33301:22 centos6-ssh container ssh服務(wù)的22端口被映射到主機(jī)的33301端口 ENV 用來設(shè)置環(huán)境變量,比如: ENV LANG en_US.UTF-8 ENV LC_ALL en_US.UTF-8 ADD 將文件<src>拷貝到container的文件系統(tǒng)對應(yīng)的路徑<dest> 所有拷貝到container中的文件和文件夾權(quán)限為0755,uid和gid為0 如果文件是可識(shí)別的壓縮格式,則docker會(huì)幫忙解壓縮 如果要ADD本地文件,則本地文件必須在 docker build <PATH>,指定的<PATH>目錄下 如果要ADD遠(yuǎn)程文件,則遠(yuǎn)程文件必須在 docker build <PATH>,指定的<PATH>目錄下。比如: docker build github.com/creack/docker-firefox docker-firefox目錄下必須有Dockerfile和要ADD的文件 注意:使用docker build - < somefile方式進(jìn)行build,是不能直接將本地文件ADD到container中。只能ADD url file. ADD只有在build鏡像的時(shí)候運(yùn)行一次,后面運(yùn)行container的時(shí)候不會(huì)再重新加載了。 VOLUME 可以將本地文件夾或者其他container的文件夾掛載到container中。 WORKDIR 切換目錄用,可以多次切換(相當(dāng)于cd命令),對RUN,CMD,ENTRYPOINT生效 ONBUILD ONBUILD 指定的命令在構(gòu)建鏡像時(shí)并不執(zhí)行,而是在它的子鏡像中執(zhí)行 #####dockerfile語法###### ###########腳本########################### # Version: 1.0.0 # Create Time: 2015-10-16 09:04 # Author: baibai # Description: 在最新版本的ubuntu系統(tǒng)中安裝jdk,構(gòu)建可執(zhí)行java的環(huán)境 FROM index.tenxcloud.com/tenxcloud/ubuntu:latest MAINTAINER Li Siqi "lisiqi_jerry@163.com" # 將jdk安裝壓縮包解壓到/home/jdk1.8.0_51 ADD jdk-8u51-linux-x64.tar.gz /home/ # 安裝中文語言包 #RUN locale-gen zh_CN.UTF-8 # 設(shè)置java環(huán)境變量 ENV JAVA_HOME /home/jdk1.8.0_51 ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV PATH $PATH:$JAVA_HOME/bin # 設(shè)置語言環(huán)境變量 ENV LANG zh_CN.UTF-8 ENV LANGUAGE zh_CN:zh ###########腳本########################### 運(yùn)行命令 docker build -t 自定義名稱 路徑 生成一個(gè)鏡像 docker images 查看當(dāng)前所有鏡像 接下來用同樣的方式運(yùn)行tomcat ###########腳本########################### # Version: 1.0.0 # Create Time: 2015-12-25 11:04 # Author: Lin Nan # 基于已經(jīng)配置好的jdk1.8版本進(jìn)行操作 FROM jdk:latest MAINTAINER Li Nan <593158016@qq.com> # 創(chuàng)建目錄 #RUN mkdir -p -m 777 /home # 將context中的壓縮包遷移到容器中并解壓 ADD tomcat8.tar.gz /home/tomcat8/ # 暴露文件目錄 #VOLUME ["/home/docker/file/distfirstout", "/home/docker/file/input/D001"] #VOLUME ["/app/tomcat8/webapps/"] # 暴露網(wǎng)絡(luò)端口 EXPOSE 8881 # 啟動(dòng)服務(wù) ENTRYPOINT ["/home/tomcat8/apache-tomcat-8.0.24/bin/catalina.sh", "run"]
###########腳本########################### docker run -d -p 8881:8080 --name=tomcat8 tomcat8 ###########################安裝鏡像方法二結(jié)束##################################### docker images 查看鏡像 docker ps 查看容器 docker ps -a 查看所有容器,包括沒有運(yùn)行的 docker rm 刪除容器 docker rmi 刪除鏡像 docker build 新建鏡像 docker run 運(yùn)行容器 docker stop 停止容器 docker logs 查看日志 docker load 導(dǎo)入鏡像 docker save 導(dǎo)出鏡像 docker commit 容器生成鏡像 用一行命令大掃除: docker kill $(docker ps -q) ; 使用掛在方式搭載鏡像的方式
|
|
|