##docker容器安裝和配置###html
#docker的git-hub網站(帳號rshare,密rshare520):https://github.com/loginpython
#docker官網hub倉庫(帳號flyer520,密碼rhsare520):https://hub.docker.com
mysql
#docker官網文檔和鏡像:https://docs.docker.com/samples/centos/
linux
#docker官網的容器網絡配置:https://docs.docker.com/engine/userguide/networking/#bridge-networks
nginx
#docker入門實戰筆記(首選參考書):http://www.cnblogs.com/garfieldcgf/p/5462963.html
git
docker官方安裝手冊:https://docs.docker.com/engine/installation/linux/docker-ce/centos/#install-using-the-repository
github
docker官方yum源:https://download.docker.com/linux/centos/docker-ce.repo
web
docker資料大全:http://sofar.blog.51cto.com/353572/1598249
sql
docker從入門到實踐:https://yeasy.gitbooks.io/docker_practice/
docker
注意:此文檔最後講解了如何配置docker自定義橋接網絡。
##docker簡介
docker容器:Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的 Linux 機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口。
說明:一、docker容器是以docker鏡像來啓動本身的環境。比KVM和VMware相比,佔用的內存資源更少。
二、在docker中能夠有本身獨立的網絡配置,能夠跟物理機用NAT網絡模式通訊。
三、運行的docker容器中能夠像虛擬機那樣安裝獨立的服務軟件。
四、支持在源鏡像中安裝新軟件,並將修改用commit保存成一個新鏡像。而後移值到其餘物理機中使用。
##docker的3個基本概念
鏡像(Image)
容器(Container)
倉庫(Repository)
理解了這三個概念,就理解了Docker的整個生命週期。
docker基本工做過程:
從倉庫--->下載鏡像--->運行在容器中
dokcer從新封裝完整鏡像過程:
基本鏡像包--->運行在容器中--->安裝所需軟件和啓動腳本--->中止容器--->commit生成新鏡像--->測試在容器中運行新鏡像。
docker與Hypervisor比較
docker工做原理和優點:http://blog.csdn.net/u012299594/article/details/52343910
用Dockerfile建立nginx新鏡像的過程:
###docker鏡像Image:就是一個只讀模板。
例如:一個鏡像能夠包含一個完整的Centos操做系統環境,裏面僅安裝了Apache或用戶須要的其它應用程序。鏡像能夠用來建立Docker容器。
Docker提供了一個很簡單的機制來建立或者更新現有的鏡像,用戶甚至能夠直接從其餘人那裏下載一個已經作好的鏡像來直接使用。
###docker容器Container:利用窗口來運行應用。
容器是從鏡像建立的運行實例。它能夠被啓動、開始、中止、刪除。每一個容器都是相互隔離的、保證安全的平臺。
能夠把容器看作是一個簡易版的Linux環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的程序。
注:鏡像是隻讀的,容器在啓動的時候建立一層可寫層做爲最上層。
###Docker倉庫Repository:是集中存放鏡像文件的場所。
有時候會把倉庫和倉庫註冊服務器(Registry)混爲一談,並不嚴格區分。註冊服務器上每每存放着多個倉庫,每一個倉庫中又包含了多個鏡像,每一個鏡像有不一樣的標籤(tag)。
倉庫分爲公開倉庫(public)和私有倉庫(private)兩種形式。
固然,用戶能夠在本地網絡內建立一個私有倉庫。
當用戶建立了本身的鏡像以後就可使用push命令將它上傳到公有或者私有倉庫,這樣下次在另一臺機器上使用這個鏡像時,只須要從倉庫上pull下來就能夠了。
注:docker倉庫的跟Git,註冊服務器能夠理解爲Github這樣的託管服務器。
#centos7安裝和配置docker
#安裝、啓動docker
說明:centos7自帶的網絡yum源中包含docker的安裝包。
yum install -y docker-io docker
rpm -q docker
service docker restart
chkconfig docker on
===========================
安裝Docker,用法簡介:
ubuntu安裝:curl -s https://get.docker.io/ubuntu/ | sudo sh
鏡像管理
docker p_w_picpaths:列出本地全部鏡像
docker search <IMAGE_ID/NAME>:查找p_w_picpath
docker pull <IMAGE_ID>:下載p_w_picpath
docker push <IMAGE_ID>:上傳p_w_picpath
docker rmi <IMAGE_ID>:刪除p_w_picpath
容器管理
docker run -i -t <IMAGE_ID> /bin/bash:-i:標準輸入給容器 -t:分配一個虛擬終端 /bin/bash:執行bash腳本
-d:以守護進程方式運行(後臺)
-P:默認匹配docker容器的5000端口號到宿主機的49153 to 65535端口
-p <HOT_PORT>:<CONTAINER_PORT>:指定端口號
--name: 指定容器的名稱
--rm:退出時刪除容器
docker stop <CONTAINER_ID>:中止container
docker start <CONTAINER_ID>:從新啓動container
docker ps - Lists containers.
-l:顯示最後啓動的容器
-a:同時顯示中止的容器,默認只顯示啓動狀態
docker ps -a 查看docker全部容器的進程
docker attach <CONTAINER_ID> 鏈接到啓動的容器
docker logs <CONTAINER_ID> : 輸出容器日誌
-f:實時輸出
docker cp <CONTAINER_ID>:path hostpath:複製容器內的文件到宿主機目錄上
docker rm <CONTAINER_ID>:刪除container
docker rm `docker ps -a -q`:刪除全部容器
docker kill `docker ps -q`
docker rmi `docker p_w_picpaths -q -a`
docker wait <CONTAINER_ID>:阻塞對容器的其餘調用方法,直到容器中止後退出
docker top <CONTAINER_ID>:查看容器中運行的進程
docker diff <CONTAINER_ID>:查看容器中的變化
docker inspect <CONTAINER_ID>:查看容器詳細信息(輸出爲Json)
-f:查找特定信息,如docker inspect -f '` `.`NetworkSettings`.`IPAddress `'
docker commit -m "comment" -a "author" <CONTAINER_ID> ouruser/p_w_picpathname:tag
docker extc -it <CONTAINER> <COMMAND>:在容器裏執行命令,並輸出結果
網絡管理
docker run -P:隨機分配端口號
docker run -p 5000:5000:綁定特定端口號(主機的全部網絡接口的5000端口均綁定容器的5000端口)
docker run -p 127.0.0.1:5000:5000:綁定主機的特定接口的端口號
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py:綁定udp端口號
docker port <CONTAINER_ID> 5000:查看容器的5000端口對應本地機器的IP和端口號
使用Docker Linking鏈接容器:
Docker爲源容器和接收容器建立一個安全的通道,容器之間不須要暴露端口,接收的容器能夠訪問源容器的數據
docker run -d -P --name <CONTAINER_NAME> --link <CONTAINER_NAME_TO_LINK>:<ALIAS>
數據管理
Data Volumes:volume是在一個或多個容器裏指定的特殊目錄
數據卷能夠在容器間共享和重複使用
能夠直接修改容器卷的數據
容器卷裏的數據不會被包含到鏡像中
容器卷保持到沒有容器再使用它
能夠在容器啓動的時候添加-v參數指定容器卷,也能夠在Dockerfile裏用VOLUMN命令添加
docker run -d -P --name web -v /webapp training/webapp python app.py
也能夠將容器卷掛載到宿主機目錄或宿主機的文件上,<容器目錄或文件>的內容會被替換爲<宿主機目錄或文件>的內容,默認容器對這個目錄有可讀寫權限
docker run -d -P --name web -v <宿主機目錄>:<容器目錄> training/webapp python app.py
能夠經過指定ro,將權限改成只讀
docker run -d -P --name web -v <宿主機目錄>:<容器目錄>:ro training/webapp python app.py
在一個容器建立容器卷後,其餘容器即可以經過--volumes-from共享這個容器卷數據,以下:
docker run -d -v /dbdata --name db1 training/postgres echo Data-only container for postgres
首先啓動了一個容器,併爲這個容器增長一個數據卷/dbdata,而後啓動另外一個容器,共享這個數據卷
docker run -d --volumes-from db1 --name db2 training/postgres
此時db2使用了db1的容器卷,當容器db1被刪除時,容器卷也不會被刪除,只有全部容器再也不使用此容器卷時,纔會被刪除
docker rm -v:刪除容器卷
除了共享數據外,容器卷另外一個做用是用來備份、恢復和遷移數據
docker run --volumes-from db1 -v /home/backup:/backup ubuntu tar cvf /backup/backup.tar /dbdata
啓動一個容器數據卷使用db1容器的數據卷,同時新創建一個數據卷指向宿主機目錄/home/backup,將/dbdata目錄的數據壓縮爲/backup/backup.tar
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
docker run --volumes-from dbdata2 -v /home/backup:/backup busybox tar xvf /backup/backup.tar
啓動一個容器,同時把backup.tar的內容解壓到容器的backup
倉庫管理
docker login:登陸
===========================
#實驗:用docker快速部署nginx服務器:
源貼:
第1步:安裝docker,啓動服務,查看信息。
yum install -y docker
service docker restart
chkconfig docker on
docker info
第2步:查找nginx鏡像,並抓取鏡像(下載鏡像),查看鏡像。
docker search nginx //查找
docker pull nginx //下載
docker p_w_picpaths //查看全部鏡像
docker save nginx > nginx.tar //導出nginx鏡像
練習:下載centos6的docker鏡像,並導出鏡像。
docker search centos
docker pull centos:6
docker p_w_picpaths
docker save centos:6 > centos6.tar
docker run --name ct6a -d -i -t centos:6 /bin/bash 在容器中運行centos:6鏡像
第3步:指定鏡像建立容器並啓動服務。訪問nginx的測試網站。
docker run -d -p 8088:80 --name cn1 nginx
curl 127.0.0.1:8088 //ip是容器默認的ip,用ifconfig查看
參數說明:-d 放在後臺執行(daemon)
-p 主機端口:容器端口 將容器的端口映射到主機上,目的是能夠直接對外提供訪問。
--name 指定容器名稱 -i以交互式運行 -t分配一個終端
第5步:容器的管理。
docker ps -a //查看全部容器
docker kill cn1 //結束cn1這個容器
docker start cn1 //啓動cn1容器
docker rm cn1 //刪除cn1容器
實用命令:
以交互式方式進入容器:docker exec -it 容器名 bash
退出docker容器交互模式:exit 或 ctrl+p+q
建立docker橋接網卡:docker -d -b br1
-------------------
###docker經常使用命令彙總:
查看docker幫助:docker
查看docker的start命令幫助:docker start --help
查看docker信息:docker info
查找nginx鏡像:docker search nginx
設置docker鏡像下載的倉庫:
查看本地鏡像:docker p_w_picpaths
查看docker容器進程:docker ps -a
docker下載的鏡像保存的路徑:ls /var/lib/docker/
下載鏡像:docker pull 鏡像名:tag號
鏡像centos6下載實例(有yum源和網絡):docker pull centos:6
鏡像centos7下載實例(無yum源和網絡):docker pull centos:7
例:docker run --name webserver0 -p 8081:80 -d nginx
說明:--name是指定容器名稱,-p 8081:80是作端口映射,映射外部8081端口到容器的80端口,
-d是daemon後臺運行。-i是以交互式方式運行,-t是分配一個tty(僞終端)。
運行docker容器:docker run --name 實例名稱 -d 鏡像名
運行docker容器實例:docker run --name cto7 -d centos:7
交互的方式進入已經運行的容器中:docker exec -it centos:6 /bin/bash
查看docker容器日誌(操做日誌):docker logs id或Name
查看差別(容器和鏡像對比):docker diff id或name
說明:CONTAINER_ID(是容器ID號)或Name(是容器名稱)
中止docker容器:docker stop CONTAINER_ID或Name
啓動docker容器:docker restart CONTAINER_ID或Name
刪除docker窗口:docker rm CONTAINER_ID或Name
發佈docker鏡像:docker push new_p_w_picpath_name
(不用作)登陸registry server(login)
#登錄registry server; -e, --email="" Email; -p, --password="" Password; -u, --username="" Username
#登陸:docker login
返回正常系統:ctrl+p+q(正常返回後臺運行) (或exit退出並中止運行)
進入docker實例環境:docker attach CONTAINER_ID或Name
docker其餘命令:
#啓動sshd服務:/sbin/sshd -D
#退出,但不中止容器:Ctrl+P+Q
#回到Docker下面,中止容器: docker stop <容器名或ID>
#啓動容器: docker start <容器名或ID>
#提交當前容器到鏡像:docker commit <容器ID> <NAME/VERSION> 新鏡像名
#啓動新容器,而且進行端口映射:
docker run -itd -p 50001:22 <剛纔提交的鏡像ID> /bin/bash
查看容器日誌:
docker logs Name/ID
# 顯示一個運行的容器裏面的進程信息:docker top Name/ID
# 從容器裏面拷貝文件/目錄到本地一個路徑:
docker cp Name:/container_path to_path
docker cp ID:/container_path to_path
#啓動sshd服務:/usr/sbin/sshd -D
-------------
保存和加載鏡像(save、load)
當須要把一臺機器上的鏡像遷移到另外一臺機器的時候,須要保存鏡像與加載鏡像。
#保存鏡像到一個tar包; -o, --output="" Write to an file
方法一:docker save p_w_picpath_name -o file_path
方法二:docker save p_w_picpath_name > file_path
# 加載一個tar包格式的鏡像; -i, --input="" Read from a tar archive file
方法一:docker load -i file_path
方法二:docker load < file_path
# 機器a導出鏡像: docker save p_w_picpath_name > /home/save.tar
# 使用scp將save.tar拷到機器b上。
#機器b導入鏡像: $docker load < /home/save.tar
-------------
利用 commit 理解鏡像構成
用commit建立鏡像的思路:下載鏡像--->運行容器--->在容器中修改文件--->commit生成新鏡像--->查鏡像列表--->測試新鏡像。
實例:下載nginx鏡像,在容器中運行nginx鏡像,在容器中修改文件,生成新鏡像並測試。
具體實施:
第1步:下載nginx鏡像。
docker pull nginx
第2步:在容器中運行鏡像。
docker run --name webserver -d -p 801:80 nginx
curl 127.0.0.1:801
第3步:進入docker容器,在容器中修改文件。
docker exec -it webserver bash
echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
exit 或 ctrl+p+q
curl 127.0.0.1:801
第4步:查看差別,並commit生成新鏡像。
docker commit 的語法格式爲:
docker commit [選項] <容器ID或容器名> [<倉庫名>[:<標籤>]]
查看差別:docker diff webserver
生成新鏡像:
方法一:docker commit webserver nginx:v2
方法二:docker commit \
--author "flyer <2559721591@qq.com>" \
--message "修改了默認網頁" \
webserver \
nginx:v2
說明:--author聲明做者信息,--message聲明所作的修改。
第5步:查看鏡像列表,在容器中運行新鏡像。測試訪問。
docker p_w_picpaths
docker history nginx:v2
docker run --name web2 -d -p 802:80 nginx:v2
curl 127.0.0.1:802
附加任務:將生成的nginx:v2鏡像導出成nginx_v2.tar文件,複製到另外一臺linux主機上,導入nginx_v2.tar到docker倉庫中。
一、導出nginx:v2鏡像。
方法一:docker save nginx:v2 > nginx_v2.tar
方法二:docker save nginx:v2 -o nginx_v2.tar
二、導入nginx:v2.tar鏡像。
方法一:docker load < nginx_v2.tar
方法二:docker load -i nginx_v2.tar
注意:慎用commit生成新鏡像。
由於commit生成的新鏡像是屬於完整鏡像包,會致使鏡像包太大。
生成的鏡像也被稱爲黑箱鏡像,換句話說,就是除了製做鏡像的人知道執行過
什麼命令、怎麼生成的鏡像,別人根本無從得知。
docker commit 命令除了學習以外,還有一些特殊的應用場合,好比被***後保存現場等。
可是,不要使用 docker commit 定製鏡像,定製行爲應該使用 Dockerfile 來完成。
下面的章節咱們就來說述一下如何使用 Dockerfile 定製鏡像。
-------------
使用Dockerfile建立nginx的新鏡像:
使用 Dockerfile 定製鏡像
從剛纔的 docker commit 的學習中,咱們能夠了解到,鏡像的定製實際上就是定製每一層所添加的配置、文件。
若是咱們能夠把每一層修改、安裝、構建、操做的命令都寫入一個腳本,用這個腳原本構建、定製鏡像,
那麼以前說起的沒法重複的問題、鏡像構建透明性的問題、體積的問題就都會解決。這個腳本就是 Dockerfile。
Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令構建一層,所以每一條指令的內容,就是描述該層應當如何構建。
用Dockerfile建立鏡像的思路:
準備目錄,建立Dockerfile文件--->docker build生成鏡像--->查鏡像列表--->測試新鏡像。
還以以前定製 nginx 鏡像爲例,此次咱們使用 Dockerfile 來定製。
第1步:在一個空白目錄中,創建一個文本文件,並命名爲 Dockerfile:
mkdir mynginx
cd mynginx
touch Dockerfile
其內容爲:cat Dockerfile
FROM nginx
EXPOSE 80
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
這個 Dockerfile 很簡單,一共就兩行。涉及到了兩條指令,FROM 和 RUN。
Dockerfile內容解釋:
FROM 指定基礎鏡像
所謂定製鏡像,那必定是以一個鏡像爲基礎,在其上進行定製。就像咱們以前運行了一個 nginx 鏡像的容器,
再進行修改同樣,基礎鏡像是必須指定的。而 FROM 就是指定基礎鏡像,所以一個 Dockerfile 中 FROM 是必備的指令,
而且必須是第一條指令。
第2步:用Dockerfile生成鏡像nginx:v3:
docker build -t nginx:v3 .
docker p_w_picpaths
第3步:啓動新容器cn5運行鏡像nginx:v3:
docker run -d -p 803:80 --name web3 nginx:v3
docker ps
第4步:測試訪問:
curl 127.0.0.1:803 或 firefox 127.0.0.1:803 看到網頁內容以下
Hello, Docker!
-------------
實例:用Dockerfile以centos6的docker鏡像爲基礎,建立新鏡像mysql:v2。並在容器中運行新鏡像,進行測試。
第1步:準備目錄,建立Dockerfile文件。
mkdir mysqltest
cd mysqltest
vi Dockerfile 全文內容以下
#指定參考鏡像,run運行命令。
FROM centos:6
RUN yum install -y mysql-server mysql
#修改my.cnf配置文件。
RUN sed -i '1a\character_set_server=utf8' /etc/my.cnf
RUN sed -i '2a\default-storage-engine=innodb' /etc/my.cnf
RUN sed -i '3a\log-bin=mysql-bin' /etc/my.cnf
RUN sed -i '4a\max_connections=100' /etc/my.cnf
RUN sed -i '5a\#server-id=2' /etc/my.cnf
RUN sed -i '6a\skip-name-resolve' /etc/my.cnf
RUN sed -i '$a\[mysql]' /etc/my.cnf
RUN sed -i '$a\default-character-set=utf8' /etc/my.cnf
RUN sed -i '$a\prompt="(\\u@\\h) [\\d]> " ' /etc/my.cnf
#啓動服務,建立一個新的管理員帳號。
RUN /etc/init.d/mysqld restart &&\
chkconfig mysqld on &&\
mysql -e "grant all on *.* to admin@'%' identified by 'admin' with grant option;flush privileges;" &&\
mysql -e "grant all on *.* to admin@'localhost' identified by 'admin' with grant option;flush privileges;" &&\
mysql -e "grant replication slave on *.* to rep@'%' identified by 'rep';flush privileges;" &&\
echo 'install ok.'
EXPOSE 3306
CMD ["/usr/bin/mysqld_safe"]
第2步:在mysqltest目錄用Dockerfile生成mysql:v2鏡像。
docker build -t mysql:v2 .
第3步:查看鏡像列表,在容器中運行mysql:v2,查看docker全部的容器進程。
docker p_w_picpaths
docker run --name m2 -d mysql:v2
docker ps -a
第4步:進入m2名稱的容器的交互操做。執行命令,並退出容器。
docker exec -it m2 bash
mysql -uadmin -padmin -e "select user,host,password from mysql.user;"
exit 或 ctrl+p+q 退出容器
docker ps -a
-------------
Dockerfile 指令詳解
咱們已經介紹了 FROM,RUN,還說起了 COPY, ADD,其實 Dockerfile 功能很強大,它提供了十多個指令。這裏咱們繼續講解剩下的指令。
資料網址:https://yeasy.gitbooks.io/docker_practice/p_w_picpath/dockerfile/
Dockerfile 指令詳解:
COPY 複製文件
ADD 更高級的複製文件
CMD 容器啓動命令
ENTRYPOINT 入口點
ENV 設置環境變量
ARG 構建參數
VOLUME 定義匿名卷
EXPOSE 暴露端口
WORKDIR 指定工做目錄
USER 指定當前用戶
HEALTHCHECK 健康檢查
ONBUILD 爲他人做嫁衣裳
-------------
Docker建立MySQL容器的p_w_picpath鏡像:
目標:本文目的是建立一個MySQL的p_w_picpath,而且在新建立出來的容器裏自動啓動mysql服務接受外部鏈接
參考步驟(已驗證OK):
必須的準備:保證建立Docker鏡像的機器可以正常上網。由於建立新鏡像時會自動從網絡上下載文件。
第1步. 首先建立一個目錄/ak,並在/ak目錄下建立一個Dockerfile,文件內容以下
#以centos:centos6鏡像做爲基礎鏡像來建立新的鏡像。
FROM centos:centos6
#做者信息
MAINTAINER Flyer "2559721591@qq.com"
#安裝軟件,修改my.cnf配置文件
RUN yum install -y mysql-server mysql
##如下RUN是一條完整的命令,其中&&是邏輯與,\命令換行符。
RUN /etc/init.d/mysqld start &&\
mysql -e "grant all on *.* to 'admin'@'%' identified by 'admin';"&&\
mysql -e "grant all on *.* to 'admin'@'localhost' identified by 'admin';"&&\
mysql -e "grant all on *.* to 'admin'@'127.0.0.1' identified by 'admin';"&&\
mysql -e "grant replication slave on *.* to 'rep'@'%' identified by 'rep';"&&\
mysql -e "grant all privileges on *.* to 'root'@'%' identified by 'admin';"&&\
mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by 'admin';"&&\
mysql -u root -padmin -e "show databases;"
##內部端口號
EXPOSE 3306
##容器啓動時要執行的命令
CMD ["/usr/bin/mysqld_safe"]
第2步. 在Dockerfile所在目錄下運行build命令來生成p_w_picpath文件,這裏使用mysql_server做爲p_w_picpath文件名
docker build -t mysql_server ./
說明:可能第1次會失敗,由於要同步網絡數據,請再執行一遍上面的命令。
運行完build命令後,可使用「Docker p_w_picpaths」來查看。
第3步. 啓動容器
3.1 首先使用下面的命令來啓動容器
docker run --name=mysqlserver -dit -P mysql_server
說明:啓動容器,名稱爲mysqlserver,之後臺方式運行,映射隨機端口,容器的鏡像爲mysql_server。
交互的方式進入已經運行的容器中:docker exec -it mysqlserver bash
啓動完容器後,可使用「docker ps」來查看,此時能夠看PORTS列內容爲「0.0.0.0:49153->3306/tcp」,容器的3306端口會被映射到宿主機器的49153端口,這樣咱們就能夠經過宿主機器的49153端口來鏈接了,好比:
mysql -h <宿主機器> -u root -padmin -P 49153
3.2 另外在運行容器的時候也能夠經過下面的命令
docker run --name=mysqlserver -d -p 3306:3306 mysql_server
此時容器的3306端口會被映射到宿主機器的3306端口,這樣咱們就能夠經過宿主機器的3306端口訪問mysql了
mysql -h <宿主機器> -u root -padmin
3.3 還有一種狀況就是爲了安全考慮,我只但願當前的宿主機器能夠訪問mysql服務,此時咱們能夠
docker run --name=mysqlserver -d -p 127.0.0.1:3306:3306 mysql_server
4.1 導出mysql_server鏡像。
方法一:docker save mysql_server > mysql_server.tar
方法二:docker save mysql_server -o mysql_server.tar
4.2 導入mysql_server.tar鏡像。
方法一:docker load < mysql_server.tar
方法二:docker load -i mysql_server.tar
-------------
實例:在centos:7這個docker鏡像中安裝mysql-server和mysql,並將mysqld服務設置成啓動docker容器時自動啓動,將修改後的鏡像生成一個新鏡像mysqld。
第1步:下載centos:7這個docker鏡像。
docker pull centos:7
docker p_w_picpaths
第2步:用centos:7鏡像開啓一個docker容器,安裝mysql-server、mysql軟件
docker run --name mysqld_1 -it centos:7 sh
yum install -y mysql-server mysql
service mysqld restart
chkconfig mysqld on
第3步:建立隨docker容器同步啓動的mysqld的啓動腳本。
vi /home/mysqld_auto.sh
#!/bin/sh
/etc/init.d/mysqld restart
/bin/bash
:wq保存並退出vi
添加x執行權限:chmod -v +x /home/mysqld_auto.sh
第4步:退出docker容器,將修改保存成一個新鏡像。
ctrl+p+q
docker ps -a
docker stop mysqld_1
docker commit mysqld_1 mysqld
docker p_w_picpaths
第5步:運行測試新鏡像:
docker run --name m1 -it mysqld /home/mysqld_auto.sh
service mysqld status
mysql -e "show databases;"
ctrl+p+q
docker ps -a
-------------
搭建私有倉庫
系統環境: CentOS 7.2
192.168.0.179:Docker倉庫
192.168.0.60:客戶端
安裝並啓動docker
yum -y install docker
service docker start
chkconfig docker on
搭建私有倉庫
179上下載registry鏡像
docker pull registry
防火牆添加運行5000端口
iptables -I INPUT 1 -p tcp --dport 5000 -j ACCEPT
下載完以後咱們經過該鏡像啓動一個容器
複製代碼 代碼以下:
docker run -d -p 5000:5000 --privileged=true -v /opt/registry:/tmp/registry registry
參數說明:
1.-v /opt/registry:/tmp/registry :默認狀況下,會將倉庫存放於容器內的/tmp/registry目錄下,指定本地目錄掛載到容器
2.–privileged=true :CentOS7中的安全模塊selinux把權限禁掉了,參數給容器加特權,不加上傳鏡像會報權限錯誤(OSError:[Errno 13] Permission denied: ‘/tmp/registry/repositories/liibrary')或者(Received unexpected HTTP status: 500 Internal Server Error)錯誤
客戶端上傳鏡像
修改/etc/sysconfig/docker(Ubuntu下配置文件地址爲:/etc/init/docker.conf),增長啓動選項(已有參數的在後面追加),以後重啓docker,不添加報錯,https證書問題。
OPTIONS='--insecure-registry 192.168.0.179:5000' #CentOS 7系統 other_args='--insecure-registry 192.168.0.179:5000' #CentOS 6系統
由於Docker從1.3.X以後,與docker registry交互默認使用的是https,而此處搭建的私有倉庫只提供http服務在docker公共倉庫下載一個鏡像
docker pull docker.io/centos
來修改一下該鏡像的tag
docker tag centos 192.168.0.179:5000/centos
把打了tag的鏡像上傳到私有倉庫
docker push 192.168.0.179:5000/centos
客戶端添加私有倉庫地址
# 添加這一行 ADD_REGISTRY='--add-registry 192.168.0.179:5000'
加上後,search鏡像,私有倉庫和docker hub上都會顯示;
不加搜索私有倉庫,須要命令中指定私有倉庫ip
使用倉庫中的鏡像
查詢私有倉庫中的全部鏡像,使用docker search命令:
curl -u myuser https://registry_ip:5000/v1/searchcurl registry_ip:5000/v1/search
docker search registry_ip:5000/ #centos 7 docker search registry_ip:5000/library #centos 6
查詢倉庫中指定帳戶下的鏡像,則使用以下命令:
docker search registry_ip:5000/account/
-------------
###Centos7 下創建 Docker 橋接網絡
centos7宿主機上創建Docker橋接物理網絡過程
宿主機網卡信息:
name:eth0
IP:192.168.100.99
GATEWAY:192.168.100.2
DNS:192.168.100.2
1. 中止Docker服務
~#:service docker stop
2.刪除docker0網卡
~#:ip link set dev docker0 down
~#:brctl delbr docker0
3.新建橋接物理網絡虛擬網卡br0
~#:brctl addbr br0
~#:ip link set dev br0 up
~#:ip addr add 192.168.100.100/24 dev br0 #爲br0分配物理網絡中的ip地址
~#:ip addr del 192.168.100.99/24 dev eth0 #將宿主機網卡的IP清空
~#:brctl addif br0 eth0 #將宿主機網卡掛到br0上
~#:ip route del default #刪除原路由
~#:ip route add default via 192.168.100.2 dev br0 #爲br0設置路由
4.設置docker服務啓動參數
這裏要注意的是,不一樣的Linux操做系統docker的配置文件所在不一樣
centos 在/etc/sysconfig/docker
其餘操做系統請前往下面的網址
https://docs.docker.com/installation/#installation
~#:vim /etc/sysconfig/docker #在OPTIONS='--selinux-enabled'這行中修改成OPTIONS='--selinux-enabled -b=br0'即讓docker服務啓動時使用br0網卡進行橋接
5.啓動docker服務
~#:service docker start
6.安裝pipework
~#:git clone https://github.com/jpetazzo/pipework
~#:cp ~/pipework/pipework /usr/local/bin/
7.啓動一個手動設置網絡的容器
這裏最好不要讓docker自動獲取ip,下次啓動會有變化並且自動獲取的ip可能會和物理網段中的ip衝突
~#:docker run -itd --net=none --name=test centos7 /bin/bash
9.爲test容器設置一個與橋接物理網絡同地址段的ip@網關
~#:pipework br0 test 192.168.100.11/24@192.168.100.2
10.進入容器查看ip
~#:docker attach test
-------------
Docker建立httpd容器的p_w_picpath鏡像:
目標:本文目的是建立一個MySQL的p_w_picpath,而且在新建立出來的容器裏自動啓動mysql服務接受外部鏈接
參考步驟(未驗證):
1. 首先建立一個目錄並在目錄下建立一個Dockerfile,文件內容以下
##第1步:在當前目錄建立Dockerfile文件,內容以下:
##以#號開頭的爲註釋內容,只是測試代碼(能夠不寫)。
#FROM是指定新鏡像是以centos:centos6這個鏡像做爲基礎鏡像來建立的。
FROM centos:centos6
#鏡像的建立者信息。
MAINTAINER Flyer <2559721591@qq.com>
#RUN代碼用於指定要執行的命令。一般用於安裝軟件。
#RUN yum -y update; yum clean all
#RUN yum -y install httpd && yum clean all
RUN yum -y install httpd
RUN touch /var/www/html/index.html
RUN echo "apachetest web site!!!! --Flyer " > /var/www/html/index.html
#container容器內部服務開啓的端口。主機上要用還得在啓動container時,作host-container的端口映射:
EXPOSE 80
#例如:運行容器時映射端口:docker run -d -p 127.0.0.1:33301:22 centos6-ssh
#Simple startup script to avoid some issues observed with container restart
#注意腳本目錄,將腳本添加到docker容器的/根目錄中。
ADD run-httpd.sh /run-httpd.sh
#賦予腳本執行權限
RUN chmod -v +x /run-httpd.sh
#Container容器啓動時執行的命令,可是一個Dockerfile中只能有一條CMD命令,多條則只執行最後一條CMD。
CMD ["/run-httpd.sh"]
##第2步####
在Dockerfile文件所在的目錄建立run-httpd.sh腳本,內容以下:
cat > run-httpd.sh <<EOK
#!/bin/bash
#Make sure we are not confused by old, incompletely-shutdown httpd
#context after restarting the container. httpd won't start correctly
#if it thinks it is already running.
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
EOK
注意:Dockerfile需藉助腳原本重啓httpd服務,而且最好放置於同一目錄
##第3步:在Dockerfile文件的目錄生成鏡像文件fly/httpd:centos6。
docker build -t fly/httpd:centos6 ./
docker p_w_picpaths //查看全部的鏡像
此時經過Dockerfile建立的鏡像已經建立成功,並沒有報錯。
#第4步:運行容器
方法一:啓動容器並映射到隨機端口,容器名稱爲httpdk:
之後臺方式運行:docker run --name=httpdk -d -P fly/httpd:centos6
查看docker容器進程:docker ps -a
進入已運行的容器:docker exec -it httpdk /bin/bash
退出交互模式:ctrl+p+q [退出後容器仍然運行中]
以交互式方式運行:
docker run --name=httpda -it -p 801:80 fly/httpd:centos6 /bin/bash
方法二:啓動並指定映射端口:
說明:將容器的80端口映射到物理機801端口
docker run --name=web802 -d -p 802:80 fly/httpd:centos6
curl http://localhost:802 顯示結果以下
apachetest web site!!!! --Flyer //curl測試成功
4.1 導出mysql_server鏡像。
方法一:docker save fly/httpd:centos6 > httpd_centos6.tar
方法二:docker save fly/httpd:centos6 -o httpd_centos6.tar
4.2 導入mysql_server.tar鏡像。
方法一:docker load < httpd_centos6.tar
方法二:docker load -i httpd_centos6.tar
-------------
Docker Dockerfile詳解
原貼:http://blog.csdn.net/wsscy2004/article/details/25878223
要點一:如何使用Dockerfile
Dockerfile用來建立一個自定義的p_w_picpath,包含了用戶指定的軟件依賴等。
例:當前目錄下包含Dockerfile,使用命令build來建立新的p_w_picpath,並命名爲edwardsbean/centos6-jdk1.7:
docker build -t edwardsbean/centos6-jdk1.7 /.
要點一:Dockerfile關鍵字
問題1:如何編寫一個Dockerfile,格式以下:
# CommentINSTRUCTION arguments
FROM 基於哪一個鏡像
RUN 安裝軟件用
MAINTAINER 鏡像建立者
CMD 命令
說明:Container啓動時執行的命令,可是一個Dockerfile中只能有一條CMD命令,多條則只執行最後一條CMD.
CMD主要用於container時啓動指定的服務,當Docker run command的命令匹配到CMD command時,會替換CMD執行的命令。如:
Dockerfile:
CMD echo hello world
運行一下試試:
docker run centos-cmd 運行的結果以下:
hello world
一旦命令匹配:
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 源文件 /目標文件
功能:將文件<src>拷貝到container的文件系統對應的路徑<dest>
說明:一、全部拷貝到container中的文件和文件夾權限爲0755,uid和gid爲0
二、若是文件是可識別的壓縮格式,則docker會幫忙解壓縮
三、若是要ADD本地文件,則本地文件必須在 docker build <PATH>,指定的<PATH>目錄下
四、若是要ADD遠程文件,則遠程文件必須在 docker build <PATH>,指定的<PATH>目錄下。好比:
例如:
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 指定的命令在構建鏡像時並不執行,而是在它的子鏡像中執行
詳見here
=========================
Docker:添加自定義網橋
Docker服務進程在啓動的時候會生成一個名爲docker0的網橋,容器默認都會掛載到該網橋下,
可是咱們能夠經過添加docker啓動參數-b Birdge 或更改docker配置文件來選擇使用哪一個網橋。
操做系統:centos7
刪除docker0網橋:
service docker stop //關閉docker服務
ip link set dev docker0 down //關閉docker0網橋
ip link del dev docker0 //刪除docker0網橋
自定義網橋設置(/etc/sysconfig/network-scripts/ifcfg-br0文件)
DEVICE="br0"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO="static"
IPADDR="10.10.10.20"
NETMASK="255.255.255.0"
GATEWAY="10.10.10.20"
DEFROUTE="yes"
NM_CONTROLLED="no"
重啓網絡服務
service network restart
查看網橋
[black@test opt]$ yum install -y bridge-utils
[black@test opt]$ brctl show
bridge name bridge id STP enabled interfaces
br0 8000.32e7297502be no
virbr0 8000.000000000000 yes
接下來咱們須要從新啓動docker,能夠在啓動docker服務進程時使用如下兩種方式:
第一種:-b 參數指定網橋
[root@test opt]# docker -d -b br0
INFO[0000] Listening for HTTP on unix (/var/run/docker.sock)
INFO[0000] [graphdriver] using prior storage driver "devicemapper"
WARN[0000] Running modprobe bridge nf_nat failed with message: , error: exit status 1
INFO[0000] Loading containers: start.
......
INFO[0000] Loading containers: done.
INFO[0000] Daemon has completed initialization
INFO[0000] Docker daemon commit=786b29d execdriver=native-0.2 graphdriver=devicemapper version=1.7.1
不知道爲何這樣啓動docker 服務進程會阻塞當前終端(︶︿︶),只好從新開一個終端,而後運行一個容器
[root@test shell]# docker run -ti --rm centos:latest
[root@3c6874559411 /]# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0A:0A:0A:01
inet addr:10.10.10.1 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::42:aff:fe0a:a01/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:418 (418.0 b) TX bytes:508 (508.0 b)
容器成功使用br0網橋。
第二種:修改/etc/sysconfig/docker文件
我在進行這種操做的時候遇到了一點問題,我修改了/etc/sysconfig/docker文件
[root@test opt]# vi /etc/sysconfig/docker
# /etc/sysconfig/docker
# Other arguments to pass to the docker daemon process
# These will be parsed by the sysv initscript and appended
# to the arguments list passed to docker -d
other_args="-b br0"
接着使用service docker start啓動docker服務,可是other_args並不生效,在centos7下servicer docker start仍然會採用systemctl start docker.service命令來運行,因而我就打開/usr/lib/systemd/system/docker.service查看
[root@test opt]# vi /lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket
Requires=docker.socket
[Service]
ExecStart=/usr/bin/docker -d -H fd://
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
[Install]
WantedBy=multi-user.target
發現ExecStart一項並無運行參數,因而將ExecStart改成/usr/bin/docker -d -b br0 -H fd://,運行docker服務,啓動一個容器發現可以成功使用br0網橋。
-------------------------------------------
在網上看到了一種更好的方法,將docker.service改成以下
[black@test ~]$ vi /usr/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket
Requires=docker.socket
[Service]
EnvironmentFile=-/etc/sysconfig/docker
ExecStart=/usr/bin/docker -d $other_args -H fd://
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
[Install]
WantedBy=multi-user.target
這個時候在other_args中添加的參數就有效了。
----------------------------------
使用docker login命令從命令行登錄Docker Hub
登錄命令的格式是這樣的:
docker login --username=yourhubusername --email=youremail@company.com
實例:docker login --username=flyer520 --email=12700696@qq.com
查看本地docker鏡像
docker p_w_picpaths
輸入docker push命令來推送你的鏡像到Hub庫:
docker push maryatdocker/docker-whale
實例:docker push docker.io/busybox