摘要:創建用戶組并添加用戶。默認情況下是過濾掉所有的入站規則。初始命令表示一旦容器啟動,需要運行的命令,此時使用,表示什么也不做,只需進入命令行即可。
docker翻譯為搬運工,在這里應該可以理解為搬運應用的工具,也就是云.先了解其運用場景之后更容易對他形成深刻理解.
Docker提供了一種可移植的配置標準化機制,允許你一致性地在不同的機器上運行同一個Container;而LXC本身可能因為不同機器的不同配置而無法方便地移植運行;
Docker以App為中心,為應用的部署做了很多優化,而LXC的幫助腳本主要是聚焦于如何機器啟動地更快和耗更少的內存;
Docker為App提供了一種自動化構建機制(Dockerfile),包括打包,基礎設施依賴管理和安裝等等;
Docker提供了一種類似git的Container版本化的機制,允許你對你創建過的容器進行版本管理,依靠這種機制,你還可以下載別人創建的Container,甚至像git那樣進行合并;
Docker Container是可重用的,依賴于版本化機制,你很容易重用別人的Container(叫Image),作為基礎版本進行擴展;
Docker Container是可共享的,有點類似github一樣,Docker有自己的INDEX,你可以創建自己的Docker用戶并上傳和下載Docker Image;
Docker提供了很多的工具鏈,形成了一個生態系統;這些工具的目標是自動化、個性化和集成化,包括對PAAS平臺的支持等;
docker運用場景:
web應用的自動化打包和發布;
自動化測試和持續集成、發布;
在服務型環境中部署和調整數據庫或其他的后臺應用;
從頭編譯或者擴展現有的OpenShift或Cloud Foundry平臺來搭建自己的PaaS環境。
可以看出來docker其實就是使得部署,發布變得更加快捷,更加自動化,且適應云平臺環境.再看定義:
Docker是一個開源的引擎,可以輕松的為任何應用創建一個輕量級的、可移植的、自給自足的容器。開發者在筆記本上編譯測試通過的容器可以批量地在生產環境中部署,包括VMs(虛擬機)、bare metal、
OpenStack 集群和其他的基礎應用平臺。
意思很明顯了.按照我的理解,先不考慮docker的實現方式,其實docker就是一個包含運行環境的應用,由于自身帶有所有需要的運行環境促成了他的可移植性和快速部署.
docker應用環境的集成是通過一層一層的鏡像疊加實現的,這種方式可以使得底層鏡像多次復用,結構清晰.這里不贅述docker的具體實現原理,實戰過后想來都會有一些理解.
不同的linux系統安裝docker會有些許不同,新版的redhat和centos7自帶有docker包,直接安裝即可.具體參考:docker安裝
ubuntu14.04 docker:
$ sudo apt-get update
安裝所有必須和可選的包
$ sudo apt-get install linux-image-generic-lts-trusty
重啟系統
$ sudo reboot
查看你是否安裝了wget
$ which wget
如果wget沒有安裝,先升級包管理器,然后再安裝它。
$ sudo apt-get update $ sudo apt-get install wget
獲取最新版本的 Docker 安裝包
$ wget -qO- https://get.docker.com/ | sh
系統會提示你輸入sudo密碼,輸入完成之后,就會下載腳本并且安裝Docker及依賴包。
驗證 Docker 是否被正確的安裝
$ sudo docker run hello-world
上邊的命令會下載一個測試鏡像,并在容器內運行這個鏡像。
Ubuntu Docker可選配置
這部分主要介紹了 Docker 的可選配置項,使用這些配置能夠讓 Docker 在 Ubuntu 上更好的工作。
創建 Docker 用戶組
調整內存和交換空間(swap accounting)
啟用防火墻的端口轉發(UFW)
為 Docker 配置DNS服務
創建 Docker 用戶組
docker 進程通過監聽一個 Unix Socket 來替代 TCP 端口。在默認情況下,docker 的 Unix Socket屬于root用戶,當然其他用戶可以使用sudo方式來訪問。因為這個原因, docker 進程就一直是root用戶運行的。
為了在使用 docker 命令的時候前邊不再加sudo,我們需要創建一個叫 docker 的用戶組,并且為用戶組添加用戶。然后在 docker 進程啟動的時候,我們的 docker 群組有了 Unix Socket 的所有權,可以對 Socket 文件進行讀寫。
注意:docker 群組就相當于root用戶。有關系統安全影響的細節,請查看 Docker 進程表面攻擊細節
創建 docker 用戶組并添加用戶
使用具有sudo權限的用戶來登錄你的Ubuntu。
在這過程中,我們假設你已經登錄了Ubuntu。
創建 docker 用戶組并添加用戶。
$ sudo usermod -aG docker ubuntu
注銷登錄并重新登錄
這里要確保你運行用戶的權限。
驗證 docker 用戶不使用 sudo 命令開執行 Docker
$ docker run hello-world
調整內存和交換空間(swap accounting)
當我們使用 Docker 運行一個鏡像的時候,我們可能會看到如下的信息提示:
WARNING: Your kernel does not support cgroup swap limit. WARNING: Your
kernel does not support swap limit capabilities. Limitation discarded.
為了防止以上錯誤信息提示的出現,我們需要在系統中啟用內存和交換空間。我們需要修改系統的 GUN GRUB (GNU GRand Unified Bootloader) 來啟用內存和交換空間。開啟方法如下:
使用具有sudo權限的用戶來登錄你的Ubuntu。
編輯 /etc/default/grub 文件
設置 GRUB_CMDLINE_LINUX 的值如下:
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
保存和關閉文件
更新 GRUB
$ sudo update-grub
重啟你的系統。
允許UFW端口轉發
當你在運行 docker 的宿主主機上使用UFW(簡單的防火墻)。你需要做一些額外的配置。Docker 使用橋接的方式來管理網絡。默認情況下,UFW 過濾所有的端口轉發策略。因此,當在UFW啟用的情況下使用 docker ,你必須適當的設置UFW的端口轉發策略。
默認情況下UFW是過濾掉所有的入站規則。如果其他的主機能夠訪問你的容器。你需要允許Docker的默認端口(2375)的所有連接。
設置 UFW 允許Docker 端口的入站規則:
使用具有sudo權限的用戶來登錄你的Ubuntu。
驗證UFW的安裝和啟用狀態
$ sudo ufw status
打開和編輯/etc/default/ufw文件
$ sudo nano /etc/default/ufw
設置 DEFAULT_FORWARD_POLICY 如下:
DEFAULT_FORWARD_POLICY="ACCEPT"
保存關閉文件。
重新加載UFW來使新規則生效。
$ sudo ufw reload
允許 Docker 端口的入站規則
$ sudo ufw allow 2375/tcp
Docker 配置 DNS 服務
無論是Ubuntu還是Ubuntu 桌面繁衍版在系統運行的時候都是使用/etc/resolv.conf配置文件中的127.0.0.1作為域名服務器(nameserver)。NetworkManager設置dnsmasq使用真實的dns服務器連接,并且設置 /etc/resolv.conf的域名服務為127.0.0.1。
在桌面環境下使用這些配置來運行 docker 容器的時候, Docker 用戶會看到如下的警告:
WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers
cant use it. Using default external servers : [8.8.8.8 8.8.4.4]
該警告是因為 Docker 容器不能使用本地的DNS服務。相反 Docker 使用一個默認的外部域名服務器。
為了避免此警告,你可以給 Docker 容器指定一個DNS服務器?;蛘吣憧梢越?NetworkManager 的 dnsmasq。不過當禁止 dnsmasq 可能使某些網絡的DNS解析速度變慢。
為 Docker 指定一個DNS服務器
使用具有sudo權限的用戶來登錄你的Ubuntu。
打開并編輯 /etc/default/docker
$ sudo nano /etc/default/docker
添加設置
DOCKER_OPTS="--dns 8.8.8.8"
使用8.8.8.8替換如192.168.1.1的本地DNS服務器。你可以指定多個DNS服務器,多個DNS服務器使用空格分割例如
--dns 8.8.8.8 --dns 192.168.1.1
警告:如果你正在使用的電腦需要連接到不同的網絡,一定要選擇一個公共DNS服務器。
保存關閉文件。
重啟 Docker 進程
$ sudo restart docker
或者,作為替代先前的操作過程,禁止NetworkManager中的dnsmasq(這樣會使你的網絡變慢)
打開和編輯 /etc/default/docker
$ sudo nano /etc/NetworkManager/NetworkManager.conf
注釋掉 dns = dsnmasq:
保存關閉文件
重啟NetworkManager 和 Docker
$ sudo restart network-manager $ sudo restart docker
升級Docker
在wget的時候使用-N參數來安裝最新版本的Docker:
$ wget -N https://get.docker.com/ | sh
下載鏡像
首先,訪問 Docker 中文網,在首頁中搜索名為“centos”的鏡像,在搜索的結果中,有一個“官方鏡像”,它就是我們所需的。
然后,進入 CentOS 官方鏡像頁面,在“Pull this repository”輸入框中,有一段命令,把它復制下來,在自己的命令行上運行該命令,隨后將立即下載該鏡像。
查看本地所有的鏡像:
docker images
當下載完成后,您應該會看到:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker.cn/docker/centos centos6 25c5298b1a36 7 weeks ago 215.8 MB
如果看到以上輸出,說明您可以使用“docker.cn/docker/centos”這個鏡像了,或將其稱為倉庫(Repository),該鏡像有一個名為“centos6”的標簽(Tag),此外還有一個名為“25c5298b1a36 ”的鏡像 ID(可能您所看到的鏡像 ID 與此處的不一致,那是正?,F象,因為這個數字是隨機生成的)。此外,我們可以看到該鏡像只有 215.8 MB,非常小巧,而不像虛擬機的鏡像文件那樣龐大。
現在鏡像已經有了,我們下面就需要使用該鏡像,來啟動容器。
啟動容器
只需使用以下命令即可啟動容器:
docker run -i -t -v /root/software/:/mnt/software/ 25c5298b1a36 /bin/bash
這條命令比較長,我們稍微分解一下,其實包含以下三個部分:
docker run <相關參數> <鏡像 ID> <初始命令>
其中,相關參數包括:
-i:表示以“交互模式”運行容器
-t:表示容器啟動后會進入其命令行
-v:表示需要將本地哪個目錄掛載到容器中,格式:-v <宿主機目錄>:<容器目錄>
假設我們的所有安裝程序都放在了宿主機的/root/software/目錄下,現在需要將其掛載到容器的/mnt/software/目錄下。
需要說明的是,不一定要使用“鏡像 ID”,也可以使用“倉庫名:標簽名”,例如:docker.cn/docker/centos:centos6。
初始命令表示一旦容器啟動,需要運行的命令,此時使用“/bin/bash”,表示什么也不做,只需進入命令行即可。
安裝相關軟件
為了搭建 Java Web 運行環境,我們需要安裝 JDK 與 Tomcat,下面的過程均在容器內部進行。我們不妨選擇/opt/目錄作為安裝目錄,首先需要通過cd /opt/命令進入該目錄
安裝 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/
設置環境變量
首先,編輯.bashrc文件
vi ~/.bashrc
然后,在該文件末尾添加如下配置:
export JAVA_HOME=/opt/jdk
export PATH=$PATH:$JAVA_HOME
最后,需要使用source命令,讓環境變量生效:
source ~/.bashrc
編寫運行腳本
我們需要編寫一個運行腳本,當啟動容器時,運行該腳本,啟動 Tomcat,具體過程如下:
首先,創建運行腳本:
vi /root/run.sh
然后,編輯腳本內容如下:
source ~/.bashrc
sh /opt/tomcat/bin/catalina.sh run
注意:這里必須先加載環境變量,然后使用 Tomcat 的運行腳本來啟動 Tomcat 服務。
最后,為運行腳本添加執行權限:
chmod u+x /root/run.sh
退出容器
當以上步驟全部完成后,可使用exit命令,退出容器。
隨后,可使用如下命令查看正在運行的容器:
docker ps
此時,您應該看不到任何正在運行的程序,因為剛才已經使用exit命令退出的容器,此時容器處于停止狀態,可使用如下命令查看所有容器:
docker ps -a
輸出如下內容:
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),隨后我們將通過該容器,創建一個可運行 Java Web 的鏡像。
創建 Java Web 鏡像
使用以下命令,根據某個“容器 ID”來創建一個新的“鏡像”:
docker commit 57c312bbaad1 javaweb:0.1
該容器的 ID 是“57c312bbaad1”,所創建的鏡像名是“javaweb:0.1”,隨后可使用鏡像來啟動 Java Web 容器。
啟動 Java Web 容器
有必要首先使用docker images命令,查看當前所有的鏡像:
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
可見,此時已經看到了最新創建的鏡像“javaweb:0.1”,其鏡像 ID 是“fc826a4706af”。正如上面所描述的那樣,我們可以通過“鏡像名”或“鏡像 ID”來啟動容器,與上次啟動容器不同的是,我們現在不再進入容器的命令行,而是直接啟動容器內部的 Tomcat 服務。此時,需要使用以下命令:
docker run -d -p 58080:8080 --name javaweb javaweb:0.1 /root/run.sh
稍作解釋:
-d:表示以“守護模式”執行/root/run.sh腳本,此時 Tomcat 控制臺不會出現在輸出終端上。
-p:表示宿主機與容器的端口映射,此時將容器內部的 8080 端口映射為宿主機的 58080 端口,這樣就向外界暴露了 58080 端口,可通過 Docker 網橋來訪問容器內部的 8080 端口了。
--name:表示容器名稱,用一個有意義的名稱命名即可。
關于 Docker 網橋的內容,需要補充說明一下。實際上 Docker 在宿主機與容器之間,搭建了一座網絡通信的橋梁,我們可通過宿主機 IP 地址與端口號來映射容器內部的 IP 地址與端口號,
當運行以上命令后,會立即輸出一長串“容器 ID”,我們可通過docker ps命令來查看當前正在運行的容器。
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 首頁:
http://192.168.65.132:58080/
注意:這里使用的是宿主機的 IP 地址,與對外暴露的端口號 58080,它映射容器內部的端口號 8080。
由于我測試的虛擬機采用nat映射連接,如果采用這種方法測試則需要重新將58080端口映射到宿主主機才能夠訪問
導入鏡像centos7:
docker load -i centos7 導入本地倉庫
編寫安裝jdk的Dockerfile
復制代碼
Dockerfile關鍵字
FROM
基于哪個鏡像
RUN
安裝軟件用
MAINTAINER
鏡像創建者
CMD
container啟動時執行的命令,但是一個Dockerfile中只能有一條CMD命令,多條則只執行最后一條CMD.
CMD主要用于container時啟動指定的服務,當docker run command的命令匹配到CMD command時,會替換CMD執行的命令。如:
Dockerfile:
CMD echo hello world
運行一下試試:
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啟動時執行的命令,但是一個Dockerfile中只能有一條ENTRYPOINT命令,如果多條,則只執行最后一條
ENTRYPOINT沒有CMD的可替換特性
USER
使用哪個用戶跑container
如:
ENTRYPOINT ["memcached"]
USER daemon
EXPOSE
container內部服務開啟的端口。主機上要用還得在啟動container時,做host-container的端口映射:
docker run -d -p 127.0.0.1:33301:22 centos6-ssh
container ssh服務的22端口被映射到主機的33301端口
ENV
用來設置環境變量,比如:
ENV LANG en_US.UTF-8 ENV LC_ALL en_US.UTF-8
ADD
將文件
所有拷貝到container中的文件和文件夾權限為0755,uid和gid為0
如果文件是可識別的壓縮格式,則docker會幫忙解壓縮
如果要ADD本地文件,則本地文件必須在 docker build
如果要ADD遠程文件,則遠程文件必須在 docker build
docker build github.com/creack/docker-firefox
docker-firefox目錄下必須有Dockerfile和要ADD的文件
注意:使用docker build - < somefile方式進行build,是不能直接將本地文件ADD到container中。只能ADD url file.
ADD只有在build鏡像的時候運行一次,后面運行container的時候不會再重新加載了。
VOLUME
可以將本地文件夾或者其他container的文件夾掛載到container中。
WORKDIR
切換目錄用,可以多次切換(相當于cd命令),對RUN,CMD,ENTRYPOINT生效
ONBUILD
ONBUILD 指定的命令在構建鏡像時并不執行,而是在它的子鏡像中執行
復制代碼
復制代碼
FROM index.tenxcloud.com/tenxcloud/ubuntu:latest
MAINTAINER Li Siqi "lisiqi_jerry@163.com"
ADD jdk-8u51-linux-x64.tar.gz /home/
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
ENV LANG zh_CN.UTF-8
ENV LANGUAGE zh_CN:zh
運行命令
docker build -t 自定義名稱 路徑
生成一個鏡像
docker images 查看當前所有鏡像
接下來用同樣的方式運行tomcat
FROM jdk:latest
MAINTAINER Li Nan <593158016@qq.com>
ADD tomcat8.tar.gz /home/tomcat8/
EXPOSE 8881
ENTRYPOINT ["/home/tomcat8/apache-tomcat-8.0.24/bin/catalina.sh", "run"]
復制代碼
執行命令
docker build --no-cache=true -t tomcat8 路徑
docker run -d -p 8881:8080 --name=tomcat8 tomcat8
常用命令:
復制代碼
docker images 查看鏡像
docker ps 查看容器
docker ps -a 查看所有容器,包括沒有運行的
docker rm 刪除容器
docker rmi 刪除鏡像
docker build 新建鏡像
docker run 運行容器
docker stop 停止容器
docker logs 查看日志
docker load 導入鏡像
docker save 導出鏡像
docker commit 容器生成鏡像
復制代碼
用一行命令大掃除:
docker kill $(docker ps -q) ;
docker rm $(docker ps -a -q) ;
docker rmi $(docker images -q -a)
使用掛在方式搭載鏡像的方式
http://www.linuxidc.com/Linux/2015-01/112485.htm
各個系統安裝docker的方式
http://docker.widuu.com/installation/ubuntu.html
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/125927.html
摘要:實現前述目的的方式有兩種在一個文件中指定一個基礎鏡像及需要完成的修改或通過運行一個鏡像,對其進行修改并提交。容器對外公開服務是必要的,因此允許公開容器的特定端口。鏡像必須完全可移植,不允許例外。 Docker是一個相對較新且發展非??焖俚捻椖?,可用來創建非常輕量的虛擬機。注意,這里的引號非常重要,Docker創建的并非真正的虛擬機,而更像是打了激素的chroot,嗯,是大量的激素。 D...
摘要:編程書籍的整理和收集最近一直在學習深度學習和機器學習的東西,發現深入地去學習就需要不斷的去提高自己算法和高數的能力然后也找了很多的書和文章,隨著不斷的學習,也整理了下自己的學習筆記準備分享出來給大家后續的文章和總結會繼續分享,先分享一部分的 編程書籍的整理和收集 最近一直在學習deep learning深度學習和機器學習的東西,發現深入地去學習就需要不斷的去提高自己算法和高數的能力然后...
閱讀 3514·2023-04-25 20:09
閱讀 3720·2022-06-28 19:00
閱讀 3035·2022-06-28 19:00
閱讀 3058·2022-06-28 19:00
閱讀 3131·2022-06-28 19:00
閱讀 2859·2022-06-28 19:00
閱讀 3014·2022-06-28 19:00
閱讀 2610·2022-06-28 19:00