昊鼎王五:docker容器從入門到實戰?

昊鼎王五:docker容器從入門到實戰?

1.docker簡介

1.1.docker是什麼?

docker容器:Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。

#說明:
1、docker容器是以docker鏡像來啓動自己的環境。比KVM和VMware相比,佔用的內存資源更少。
2、在docker中可以有自己獨立的網絡配置,可以跟物理機用NAT網絡模式通信。
3、運行的docker容器中可以像虛擬機那樣安裝獨立的服務軟件。
4、支持在源鏡像中安裝新軟件,並將修改用commit保存成一個新鏡像。然後移值到其他物理機中使用。

1.2.docker的3個基本概念

鏡像(Image)
容器(Container)
倉庫(Repository)

理解了這三個概念,就理解了Docker的整個生命週期。

1.3.docker基本工作過程:

從倉庫--->下載鏡像--->運行在容器中

1.4.dokcer重新封裝完整鏡像過程:

基本鏡像包--->運行在容器中--->安裝所需軟件和啓動腳本--->停止容器--->commit生成新鏡像--->測試在容器中運行新鏡像。

1.5.docker與Hypervisor比較

docker工作原理和優勢:http://blog.csdn.net/u012299594/article/details/52343910
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

1.6.此文檔最後講解了如何配置docker自定義橋接網絡。

2.用Dockerfile創建nginx新鏡像的過程:

2.1.docker鏡像Image:就是一個只讀模板。

例如:一個鏡像可以包含一個完整的Centos操作系統環境,裏面僅安裝了Apache或用戶需要的其它應用程序。鏡像可以用來創建Docker容器。
Docker提供了一個很簡單的機制來創建或者更新現有的鏡像,用戶甚至可以直接從其他人那裏下載一個已經做好的鏡像來直接使用。

2.2.docker容器Container:利用窗口來運行應用。

容器是從鏡像創建的運行實例。它可以被啓動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。
可以把容器看做是一個簡易版的Linux環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的程序。

注:鏡像是隻讀的,容器在啓動的時候創建一層可寫層作爲最上層。

2.3.Docker倉庫Repository:是集中存放鏡像文件的場所。

有時候會把倉庫和倉庫註冊服務器(Registry)混爲一談,並不嚴格區分。註冊服務器上往往存放着多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標籤(tag)。

倉庫分爲公開倉庫(public)和私有倉庫(private)兩種形式。
當然,用戶可以在本地網絡內創建一個私有倉庫。
當用戶創建了自己的鏡像之後就可以使用push命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機器上使用這個鏡像時,只需要從倉庫上pull下來就可以了。
注:docker倉庫的跟Git,註冊服務器可以理解爲Github這樣的託管服務器。

3.centos7安裝和配置docker

3.1.安裝、啓動docker

#說明:centos7自帶的網絡yum源中包含docker的安裝包。
yum  install  -y  docker-io  docker
rpm  -q  docker
service  docker  restart
chkconfig  docker  on

4.安裝Docker,用法簡介:

4.1.ubuntu安裝:

curl -s https://get.docker.io/ubuntu/ | sudo sh 

4.2.鏡像管理

docker images:列出本地所有鏡像
docker search <IMAGE_ID/NAME>:查找image
docker pull <IMAGE_ID>:下載image
docker push <IMAGE_ID>:上傳image
docker rmi <IMAGE_ID>:刪除image

4.3.容器管理

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 images -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/imagename:tag

      docker extc -it <CONTAINER> <COMMAND>:在容器裏執行命令,並輸出結果

4.4.網絡管理

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>  

4.5.數據管理

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

4.6.倉庫管理

docker login:登錄

===========================

5.實驗:用docker快速部署nginx服務器:

5.1.第1步:安裝docker,啓動服務,查看信息。

yum  install  -y  docker
service  docker  restart
chkconfig  docker  on
docker  info

5.2.第2步:查找nginx鏡像,並抓取鏡像(下載鏡像),查看鏡像。

docker  search  nginx   //查找
docker  pull  nginx     //下載
docker  images   //查看所有鏡像
docker  save  nginx  > nginx.tar   //導出nginx鏡像

#練習:下載centos6的docker鏡像,並導出鏡像。
docker  search  centos
docker  pull  centos:6
docker  images
docker  save  centos:6  > centos6.tar
docker run  --name ct6a -d -i -t centos:6  /bin/bash    在容器中運行centos:6鏡像

5.3.第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.4.第4步:容器的管理。

docker  ps  -a //查看所有容器
docker  kill  cn1   //結束cn1這個容器
docker  start  cn1   //啓動cn1容器
docker  rm   cn1   //刪除cn1容器

5.5.實用命令:

以交互式方式進入容器:docker  exec  -it  容器名   bash
退出docker容器交互模式:exit  或  ctrl+p+q
創建docker橋接網卡:docker -d -b br1

6.docker常用命令彙總:

6.1.查看docker幫助:docker

查看docker的start命令幫助:docker  start  --help
查看docker信息:docker  info
查找nginx鏡像:docker  search  nginx
設置docker鏡像下載的倉庫:
查看本地鏡像:docker   images
查看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   idname

說明: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_image_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

6.2.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 

6.3.查看容器日誌:

docker logs Name/ID

6.4.顯示一個運行的容器裏面的進程信息:

docker top Name/ID  

6.5.從容器裏面拷貝文件/目錄到本地一個路徑:

docker cp Name:/container_path to_path
docker cp ID:/container_path to_path 

6.6.啓動sshd服務:

/usr/sbin/sshd -D 

7.保存和加載鏡像(save、load)

7.1.當需要把一臺機器上的鏡像遷移到另一臺機器的時候,需要保存鏡像與加載鏡像。

#保存鏡像到一個tar包; -o, --output="" Write to an file 
方法一:docker save image_name -o file_path 
方法二:docker save image_name > file_path

7.2.加載一個tar包格式的鏡像;

 -i, --input="" Read from a tar archive file 
方法一:docker load -i file_path  
方法二:docker load  < file_path
# 機器a導出鏡像: docker save image_name > /home/save.tar
# 使用scp將save.tar拷到機器b上。
#機器b導入鏡像: $docker load < /home/save.tar 

8.利用 commit 理解鏡像構成

用commit創建鏡像的思路:下載鏡像—>運行容器—>在容器中修改文件—>commit生成新鏡像—>查鏡像列表—>測試新鏡像。
實例:下載nginx鏡像,在容器中運行nginx鏡像,在容器中修改文件,生成新鏡像並測試。
具體實施:

8.1.第1步:下載nginx鏡像。

docker  pull  nginx

8.2.第2步:在容器中運行鏡像。

docker run --name webserver -d -p 801:80  nginx
curl  127.0.0.1:801

8.3.第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

8.4.第4步:查看差異,並commit生成新鏡像。

docker commit 的語法格式爲:
docker commit [選項] <容器ID或容器名> [<倉庫名>[:<標籤>]]

查看差異:docker  diff  webserver
生成新鏡像:
方法一:docker  commit   webserver   nginx:v2
方法二:docker commit \
    --author "flyer <[email protected]>" \
    --message "修改了默認網頁" \
    webserver \
    nginx:v2
說明:--author聲明作者信息,--message聲明所做的修改。

8.5.第5步:查看鏡像列表,在容器中運行新鏡像。測試訪問。

docker images
docker history nginx:v2
docker run --name web2 -d -p 802:80 nginx:v2
curl  127.0.0.1:802

8.6.附加任務:將生成的nginx:v2鏡像導出成nginx_v2.tar文件,複製到另一臺linux主機上,導入nginx_v2.tar到docker倉庫中。

8.6.1、導出nginx:v2鏡像。

方法一:docker  save  nginx:v2  >  nginx_v2.tar
方法二:docker  save  nginx:v2  -o  nginx_v2.tar

8.6.2、導入nginx:v2.tar鏡像。

方法一:docker  load  < nginx_v2.tar
方法二:docker  load  -i nginx_v2.tar

注意:慎用commit生成新鏡像。
因爲commit生成的新鏡像是屬於完整鏡像包,會導致鏡像包太大。
生成的鏡像也被稱爲黑箱鏡像,換句話說,就是除了製作鏡像的人知道執行過
什麼命令、怎麼生成的鏡像,別人根本無從得知。
docker commit 命令除了學習之外,還有一些特殊的應用場合,比如被入侵後保存現場等。
但是,不要使用 docker commit 定製鏡像,定製行爲應該使用 Dockerfile 來完成。
下面的章節我們就來講述一下如何使用 Dockerfile 定製鏡像。

9.使用Dockerfile創建nginx的新鏡像:

使用 Dockerfile 定製鏡像
    從剛纔的 docker commit 的學習中,我們可以瞭解到,鏡像的定製實際上就是定製每一層所添加的配置、文件。
如果我們可以把每一層修改、安裝、構建、操作的命令都寫入一個腳本,用這個腳本來構建、定製鏡像,
那麼之前提及的無法重複的問題、鏡像構建透明性的問題、體積的問題就都會解決。這個腳本就是 Dockerfile。

Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。

用Dockerfile創建鏡像的思路:
準備目錄,創建Dockerfile文件--->docker  build生成鏡像--->查鏡像列表--->測試新鏡像。

還以之前定製 nginx 鏡像爲例,這次我們使用 Dockerfile 來定製。

9.1.第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 是必備的指令,
並且必須是第一條指令。

9.2.第2步:用Dockerfile生成鏡像nginx:v3:

docker  build -t nginx:v3  .
docker  images

9.3.第3步:啓動新容器cn5運行鏡像nginx:v3:

docker run -d -p 803:80 --name web3 nginx:v3
docker  ps

9.4.第4步:測試訪問:

curl  127.0.0.1:803firefox  127.0.0.1:803 看到網頁內容如下
Hello, Docker!

10.實例:用Dockerfile以centos6的docker鏡像爲基礎,創建新鏡像mysql:v2。並在容器中運行新鏡像,進行測試。

10.1.第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"]

10.2.第2步:在mysqltest目錄用Dockerfile生成mysql:v2鏡像。

docker build -t mysql:v2  .

10.3.第3步:查看鏡像列表,在容器中運行mysql:v2,查看docker所有的容器進程。

docker  images
docker  run  --name  m2  -d  mysql:v2
docker  ps  -a

10.4.第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

11.Dockerfile 指令詳解

我們已經介紹了 FROM,RUN,還提及了 COPY, ADD,其實 Dockerfile 功能很強大,它提供了十多個指令。這裏我們繼續講解剩下的指令。

資料網址:https://yeasy.gitbooks.io/docker_practice/image/dockerfile/
Dockerfile 指令詳解:
COPY 複製文件
ADD 更高級的複製文件
CMD 容器啓動命令
ENTRYPOINT 入口點
ENV 設置環境變量
ARG 構建參數
VOLUME 定義匿名卷
EXPOSE 暴露端口
WORKDIR 指定工作目錄
USER 指定當前用戶
HEALTHCHECK 健康檢查
ONBUILD 爲他人作嫁衣裳

12.Docker創建MySQL容器的image鏡像:

目標:本文目的是創建一個MySQL的image,並且在新創建出來的容器裏自動啓動mysql服務接受外部連接
參考步驟(已驗證OK):
必須的準備:保證創建Docker鏡像的機器能夠正常上網。因爲創建新鏡像時會自動從網絡上下載文件。

12.1.第1步. 首先創建一個目錄/ak,並在/ak目錄下創建一個Dockerfile,文件內容如下

#以centos:centos6鏡像作爲基礎鏡像來創建新的鏡像。
FROM centos:centos6
#作者信息
MAINTAINER Flyer "[email protected]"

#安裝軟件,修改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"]

12.2.第2步.在Dockerfile所在目錄下運行build命令來生成image文件,

這裏使用mysql_server作爲image文件名
docker build -t mysql_server  ./    
說明:可能第1次會失敗,因爲要同步網絡數據,請再執行一遍上面的命令。

運行完build命令後,可以使用“Docker images”來查看。

12.3.第3步. 啓動容器

12.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  

12.3.2.另外在運行容器的時候也可以通過下面的命令

docker run --name=mysqlserver -d -p 3306:3306 mysql_server  

此時容器的3306端口會被映射到宿主機器的3306端口,這樣我們就可以通過宿主機器的3306端口訪問mysql了
mysql -h <宿主機器> -u root -padmin  

12.3.3 還有一種情況就是爲了安全考慮,我只希望當前的宿主機器可以訪問mysql服務,此時我們可以

docker run --name=mysqlserver -d -p 127.0.0.1:3306:3306 mysql_server  

12.4.導出導入鏡像

12.4.1.導出mysql_server鏡像

方法一:docker  save  mysql_server  >  mysql_server.tar
方法二:docker  save  mysql_server  -o  mysql_server.tar

12.4.2.導入mysql_server.tar鏡像

方法一:docker  load  < mysql_server.tar
方法二:docker  load  -i mysql_server.tar

-------------

13.實例:在centos:7這個docker鏡像中安裝mysql-server和mysql,並將mysqld服務設置成啓動docker容器時自動啓動,將修改後的鏡像生成一個新鏡像mysqld。

13.1.第1步:下載centos:7這個docker鏡像。

docker  pull  centos:7
docker  images

13.2.第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

13.3.第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

13.4.第4步:退出docker容器,將修改保存成一個新鏡像。

ctrl+p+q
docker  ps  -a
docker  stop  mysqld_1
docker  commit  mysqld_1  mysqld
docker  images

13.5.第5步:運行測試新鏡像:

docker  run  --name  m1  -it  mysqld  /home/mysqld_auto.sh
service  mysqld  status
mysql  -e  "show  databases;"
ctrl+p+q
docker  ps  -a

14.搭建私有倉庫

系統環境: CentOS 7.2 
192.168.0.179:Docker倉庫 
192.168.0.60:客戶端

14.1.安裝並啓動docker

yum -y install docker
service docker start
chkconfig docker on

14.2.搭建私有倉庫

179上下載registry鏡像
docker pull registry 

14.3.防火牆添加運行5000端口

iptables -I INPUT 1 -p tcp --dport 5000 -j ACCEPT 

14.4.下載完之後我們通過該鏡像啓動一個容器

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)錯誤

14.5.客戶端上傳鏡像

修改/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

14.5.1.來修改一下該鏡像的tag

docker tag centos 192.168.0.179:5000/centos 

14.5.2.把打了tag的鏡像上傳到私有倉庫

docker push 192.168.0.179:5000/centos 

14.5.3.客戶端添加私有倉庫地址

# 添加這一行 ADD_REGISTRY='--add-registry 192.168.0.179:5000' 

加上後,search鏡像,私有倉庫和docker hub上都會顯示;

不加搜索私有倉庫,需要命令中指定私有倉庫ip

14.6.使用倉庫中的鏡像

14.6.1.查詢私有倉庫中的所有鏡像,使用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 

14.6.2.查詢倉庫中指定賬戶下的鏡像,則使用如下命令:

docker search registry_ip:5000/account/ 

15.Centos7下建立 Docker 橋接網絡

centos7宿主機上建立Docker橋接物理網絡過程

宿主機網卡信息:
name:eth0
IP:192.168.100.99
GATEWAY:192.168.100.2
DNS:192.168.100.2

15.1.停止Docker服務

~#:service docker stop

15.2.刪除docker0網卡

~#:ip link set dev docker0 down
~#:brctl delbr docker0

15.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設置路由

15.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網卡進行橋接

15.5.啓動docker服務

~#:service docker start

15.6.安裝pipework

~#:git clone https://github.com/jpetazzo/pipework
~#:cp ~/pipework/pipework /usr/local/bin/

15.7.啓動一個手動設置網絡的容器

這裏最好不要讓docker自動獲取ip,下次啓動會有變化而且自動獲取的ip可能會和物理網段中的ip衝突

~#:docker run -itd --net=none --name=test centos7 /bin/bash

15.9.爲test容器設置一個與橋接物理網絡同地址段的ip@網關

~#:pipework br0 test 192.168.100.11/[email protected]

15.10.進入容器查看ip

~#:docker attach test

16.Docker創建httpd容器的image鏡像:

目標:本文目的是創建一個MySQL的image,並且在新創建出來的容器裏自動啓動mysql服務接受外部連接
參考步驟(未驗證):

16.1.首先創建一個目錄並在目錄下創建一個Dockerfile,文件內容如下

##第1步:在當前目錄創建Dockerfile文件,內容如下:
##以#號開頭的爲註釋內容,只是測試代碼(可以不寫)。
#FROM是指定新鏡像是以centos:centos6這個鏡像作爲基礎鏡像來創建的。
FROM centos:centos6 
#鏡像的創建者信息。
MAINTAINER Flyer <3290079691@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"]   

16.2.第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服務,並且最好放置於同一目錄

16.3.第3步:

在Dockerfile文件的目錄生成鏡像文件fly/httpd:centos6。
docker  build  -t   fly/httpd:centos6  ./ 
docker  images  //查看所有的鏡像

此時通過Dockerfile創建的鏡像已經創建成功,並無報錯。

16.4.第4步:運行容器

16.4.1.方法一:啓動容器並映射到隨機端口,容器名稱爲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

16.4.2.方法二:啓動並指定映射端口:

說明:將容器的80端口映射到物理機801端口
docker run --name=web802 -d -p 802:80 fly/httpd:centos6  
curl  http://localhost:802    顯示結果如下
apachetest web site!!!! --Flyer  //curl測試成功 

16.5.1 導出mysql_server鏡像。

方法一:docker  save  fly/httpd:centos6  >  httpd_centos6.tar
方法二:docker  save  fly/httpd:centos6  -o  httpd_centos6.tar

16.6.2 導入mysql_server.tar鏡像。

方法一:docker  load  <  httpd_centos6.tar
方法二:docker  load  -i  httpd_centos6.tar

17.Docker Dockerfile詳解

17.1.要點一:如何使用Dockerfile

Dockerfile用來創建一個自定義的image,包含了用戶指定的軟件依賴等。
例:當前目錄下包含Dockerfile,使用命令build來創建新的image,並命名爲edwardsbean/centos6-jdk1.7:
docker build -t edwardsbean/centos6-jdk1.7 /.

17.2.要點一:Dockerfile關鍵字

17.3.問題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>

說明:1、所有拷貝到container中的文件和文件夾權限爲0755,uid和gid爲0
2、如果文件是可識別的壓縮格式,則docker會幫忙解壓縮
3、如果要ADD本地文件,則本地文件必須在 docker build <PATH>,指定的<PATH>目錄下
4、如果要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

18.Docker:添加自定義網橋

Docker服務進程在啓動的時候會生成一個名爲docker0的網橋,容器默認都會掛載到該網橋下,

但是我們可以通過添加docker啓動參數-b Birdge 或更改docker配置文件來選擇使用哪個網橋。

操作系統:centos7

18.1.刪除docker0網橋:

service docker stop //關閉docker服務  
ip link set dev docker0 down //關閉docker0網橋   
ip link del dev docker0       //刪除docker0網橋  

18.2.自定義網橋設置(/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"  

18.3.重啓網絡服務

service network restart  

18.4.查看網橋

[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  

18.5.接下來我們需要重新啓動docker

可以在啓動docker服務進程時使用以下兩種方式:

18.5.1.第一種:-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網橋。

18.5.2.第二種:修改/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中添加的參數就有效了。

19.使用docker login命令從命令行登陸Docker Hub

19.1.登陸命令的格式是這樣的:

docker login --username=yourhubusername --email=youremail@company.com

實例:docker login --username=flyer520 --email=12700696@qq.com

19.2.查看本地docker鏡像

docker  images

19.3.輸入docker push命令來推送你的鏡像到Hub庫:

docker push  maryatdocker/docker-whale

實例:docker  push  docker.io/busybox

20.其他相關

##docker容器安裝和配置###
#docker的git-hub網站 :https://github.com/login
#docker官網hub倉庫 :https://hub.docker.com
#docker官網文檔和鏡像:https://docs.docker.com/samples/centos/
#docker官網的容器網絡配置:https://docs.docker.com/engine/userguide/networking/#bridge-networks
#docker入門實戰筆記(首選參考書):http://www.cnblogs.com/garfieldcgf/p/5462963.html
docker官方安裝手冊:https://docs.docker.com/engine/installation/linux/docker-ce/centos/#install-using-the-repository
docker官方yum源:https://download.docker.com/linux/centos/docker-ce.repo

docker資料大全:http://sofar.blog.51cto.com/353572/1598249
docker從入門到實踐:https://yeasy.gitbooks.io/docker_practice/

好了,聰明如你,知道了docker容器從入門到實戰,是不是很歡喜 ^_^

還有其他問題的可以在評論區留言或者掃碼加博主獲取資源或者提問。
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章