docker容器從入門到實戰0826

##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

timg?p_w_picpath&quality=80&size=b9999_10000&s



wKiom1TtaLvy-Is-AAB0hhDBRYM506.jpg


215GR024-1.png


用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

相關文章
相關標籤/搜索