天天看點

Docker 快速學習

Docker

作業系統:centos 6.5

一、安裝:

1、配置epel源:

1

<code>yum </code><code>install</code> <code>-y yum-priorities &amp;&amp; rpm -ivh http:</code><code>//dl</code><code>.fedoraproject.org</code><code>/pub/epel/6/x86_64/epel-release-6-8</code><code>.noarch.rpm &amp;&amp; rpm --</code><code>import</code> <code>/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6</code>

2、安裝 docker-io febootstrap

# febootstrap用來制作centos鏡像的工具

<code>yum </code><code>install</code> <code>docker-io febootstrap -y</code>

3、安裝完成後挂cgroup檔案系統

2

3

<code>vim </code><code>/etc/fstab</code>

<code>添加一行:</code>

<code>none            </code><code>/sys/fs/cgroup</code>      <code>cgroup  defaults    0 0</code>

4、重新開機系統:

<code>reboot</code>

docker 開機後會自動啟動,如果沒有啟動可以手動啟動:docker -d &amp;

二、下面來制作一個Centos 6.5 鏡像

1、使用febootstrap制作CentOS鏡像檔案centos6-image目錄

<code>febootstrap -i </code><code>bash</code> <code>-i wget -i yum -i iputils -i iproute -i </code><code>man</code> <code>-i vim -i openssh-server -i openssh-clients -i </code><code>tar</code> <code>-i </code><code>gzip</code> <code>centos6 centos6-image http:</code><code>//mirrors</code><code>.aliyun.com</code><code>/centos/6/os/x86_64/</code>

#參數說明:

-i 鏡像所需要安裝的工具:把-i後面的參數傳遞給yum來實作安裝,上面安裝了ssh服務

centos6 是centos版本

centos6-image 是指定目錄

指令的執行完成後,會在目前目錄下生成一個目錄centos6-image

4

5

6

<code>cd</code> <code>centos6-images</code>

<code>ls</code> 

<code>bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var</code>

<code>ls</code> <code>-a root</code>

<code>. ..</code>

這時root目錄下沒有任何檔案,也不沒有隐藏的點檔案,如:.bash_logout  .bash_profile  .bashrc

如果這時制作出來的鏡像使用ssh登入,會直接進入根目錄下,如下:

<code>bash</code><code>-4.1.2</code><code>#</code>

<code>bash</code><code>-4.1.2</code><code># ls </code>

<code>bash</code><code>-4.1.2</code><code># ls -a root</code>

為了避免這種情況,可以在centos6-image目錄的root目錄把.bash_logout  .bash_profile  .bashrc這三個檔案設定一下

<code>cd</code> <code>centos6-image &amp;&amp; </code><code>cp</code> <code>etc</code><code>/skel/</code><code>.</code><code>bash</code><code>* root/</code>

這樣就可以實作遠端登入正常了

基于這樣的實作,我們把可以以後一些複雜的配置檔案事先配置好後放在一個目錄下,然後再通過Dockerfile檔案來調用,即可快速完成。

2、下面來建立一個基本的鏡像:

<code>cd</code> <code>centos6-image &amp;&amp; </code><code>tar</code> <code>-c .|docker </code><code>import</code> <code>- centos6-base</code>

指令完成後,使用docker images來檢視

<code>docker images</code>

<code>REPOSITORY            TAG                 IMAGE ID            CREATED             VIRTUAL SIZE</code>

<code>centos6-base          latest              a01c3d440db8        1 minutes ago        311.3 MB</code>

此時一個基本的鏡像已完成,

3、下面來用Dockerfile檔案來建立一個可以ssh登入的鏡像

Dockefile 檔案如下:

7

8

9

10

11

12

13

14

15

<code>#Dockerfile</code>

<code>FROM centos6-base</code>

<code>MAINTAINER zhou_mfk &lt;[email protected]&gt;</code>

<code>RUN </code><code>ssh</code><code>-keygen -q -N </code><code>""</code> <code>-t dsa -f </code><code>/etc/ssh/ssh_host_dsa_key</code>

<code>RUN </code><code>ssh</code><code>-keygen -q -N </code><code>""</code> <code>-t rsa -f </code><code>/etc/ssh/ssh_host_rsa_key</code>

<code>RUN </code><code>sed</code> <code>-ri </code><code>'s/session    required     pam_loginuid.so/#session    required     pam_loginuid.so/g'</code> <code>/etc/pam</code><code>.d</code><code>/sshd</code>

<code>RUN </code><code>mkdir</code> <code>-p </code><code>/root/</code><code>.</code><code>ssh</code> <code>&amp;&amp; </code><code>chown</code> <code>root.root </code><code>/root</code> <code>&amp;&amp; </code><code>chmod</code> <code>700 </code><code>/root/</code><code>.</code><code>ssh</code>

<code>EXPOSE 22</code>

<code>RUN </code><code>echo</code> <code>'root:redhat'</code> <code>| chpasswd</code>

<code>RUN yum </code><code>install</code> <code>-y yum-priorities &amp;&amp; rpm -ivh http:</code><code>//dl</code><code>.fedoraproject.org</code><code>/pub/epel/6/x86_64/epel-release-6-8</code><code>.noarch.rpm &amp;&amp; rpm --</code><code>import</code> <code>/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6</code>

<code>RUN yum </code><code>install</code> <code>tar</code> <code>gzip</code> <code>gcc vim wget -y</code>

<code>ENV LANG en_US.UTF-8</code>

<code>ENV LC_ALL en_US.UTF-8</code>

<code>CMD </code><code>/usr/sbin/sshd</code> <code>-D</code>

<code>#End</code>

下面使用上面的Dockerfile檔案來建立一個可ssh登入的鏡像

<code>docker build -t centos6-</code><code>ssh</code> <code>.</code>

build: Build a container from a Dockerfile 這個是建立一個容器從Dockerfile檔案

docker build &lt;path&gt; 尋找path路徑下名為的Dockerfile的配置檔案,使用此配置生成新的image

. 表示在目前目錄下

<code>docker build -t centos6-</code><code>ssh</code> <code>/root/images/abc</code>

  這個表示Dockerfile檔案在:/root/images/abc下

指令執行完成後,centos6-ssh鏡像就建立完成了,

檢視一下:

<code>centos6-</code><code>ssh</code>           <code>latest              b8ca70e7adee        1 hours ago        311.3 MB</code>

<code>centos6-base          latest              a01c3d440db8        2 hours ago        311.3 MB</code>

下面建立一個容器來登入下:

<code>docker run -d -p 127.0.0.1:2222:22 centos6-</code><code>ssh</code>

<code>ssh</code> <code>[email protected] -p 2222</code>

<code>輸入密碼:redhat</code>

<code>[root@a856a3c242cf ~]</code><code># </code>

<code>[root@a856a3c242cf ~]</code><code># ls</code>

<code>[root@a856a3c242cf ~]</code><code># cat /etc/issue</code>

<code>CentOS release 6.5 (Final)</code>

<code>Kernel \r on an \m</code>

Docker 容器間的使用

1、容器間的連結:

運作一個容器,給它一個名稱,例如:

<code>docker run -d -p 0.0.0.0:4455:22 -p 0.0.0.0:8080:80 --name one centos6-</code><code>ssh</code>

再運作另一個容器

<code>docker run -d -p 0.0.0.0:4456:22 -p 0.0.0.0:8088:80 --link </code><code>/one</code><code>:two centos6-ssh2 </code><code>env</code>

說明:

/one:two 

one是第一個容器的名稱,two是第二個容器的名稱,

env是列印出來 第二個容器的環境變量

這樣兩容器就建立起一個網絡通道,one和two容器所開放的端口也就是Dockerfile檔案中定義開放的端口就可以連通了,

在主控端上使用iptables指令來檢視,例如:

<code>iptables -L -n</code>

<code>Chain FORWARD (policy ACCEPT)</code>

<code>target     prot opt </code><code>source</code>               <code>destination         </code>

<code>ACCEPT     tcp  --  172.17.1.28          172.17.1.29         tcp spt:3306 </code>

<code>ACCEPT     tcp  --  172.17.1.29          172.17.1.28         tcp dpt:3306 </code>

<code>ACCEPT     tcp  --  172.17.1.28          172.17.1.29         tcp spt:22 </code>

<code>ACCEPT     tcp  --  172.17.1.29          172.17.1.28         tcp dpt:22</code>

從這裡看到兩個容器間端口可以互相的通路了,

這裡的端口是以one這個容器所開放的端口,如one開放22,3306,而two容器隻開放了22,在two上也會放3306給one,反之就不行了。--link是以連接配接容器開放的端口為準的。

2、Docker 容器下資料卷的了解

一個資料卷就是經過特殊設計的,在一個或多個容器中通過UFS檔案系統提供的一些特性 

實作資料持久化或共享.

資料卷可以在容器之間共享和重複利用

可以對資料卷裡的内容直接進行修改

對鏡像的更新不會改變資料卷的内容

卷會一直持續到沒有容器使用他們

2.1、添加一個資料卷

可以使用帶有 -v 參數的 docker run 指令給容器添加一個資料卷.

<code>docker run -d -p 0.0.0.0:4445:22 --name data -</code><code>v</code> <code>/data</code> <code>centos6-</code><code>ssh</code>

這個在容器裡就會有一個/data的卷

在Dockefile中使用VOLUME指令來建立添加一個或多個資料卷

2.2、挂載宿主檔案夾到資料卷

使用-v參數也可以挂載宿主的檔案夾到容器裡

<code>docker run -d -p 0.0.0.0:44455:22 --name data1 -</code><code>v</code> <code>/src/data</code><code>:</code><code>/opt/data</code> <code>centos6-</code><code>ssh</code>

這樣會把本地的/src/data檔案夾挂在容器/opt/data目錄

主控端上的檔案夾必須是絕對路徑,而且當檔案夾不存在時會自動建立

此功能在Dockerfile檔案中無法使用

預設情況下Docker以讀寫權限挂載資料卷,但是我們也可以以隻讀方式進行挂載

<code>docker run -d -p 0.0.0.0:44455:22 --name data1 -</code><code>v</code> <code>/src/data</code><code>:</code><code>/opt/data</code><code>:ro centos6-</code><code>ssh</code>

還是上面的那個指令,隻是我們添加了一個ro選項來制定挂載時檔案權限應該是隻讀的

2.3、建立和挂在一個資料卷容器

如果一些資料需要在容器間共享最好的方式來建立一個資料卷容器,然後從資料卷容器中挂載資料

1\建立一個帶有命名容器來共享資料

<code>docker run -d -</code><code>v</code> <code>/dbdata</code> <code>--name dbdata centos6-</code><code>ssh</code>

2\在另一個容器中使用--volumes-from标記挂在/dbdata卷

<code>docker run -d --volumes-from dbdata --name db1 centos6-ssh2</code>

3\在另一個容器中同時也挂載/dbdata卷

<code>docker run -d --volumes-from dbdata --name db2 centos6-ssh3</code>

可以使用多個 -–volumes-from 參數來把多個容器中的多個資料卷放到一起

可以挂載通過挂載dbdata容器實作的容器db1和db2來擴充關系鍊,例如:

<code>docker run -d --name db2 --volumes-from db1 centos6-ssh4</code>

2.4、備份,恢複,遷移資料

使用它們來進行備份,恢複或遷移資料.如下所示,我們使用 

–volumes-from 标記來建立一個挂載了要備份資料卷的容器.

<code>docker run --volumes-from dbdata -</code><code>v</code> <code>$(</code><code>pwd</code><code>):</code><code>/backup</code> <code>centos6-</code><code>ssh</code> <code>tar</code> <code>cvf </code><code>/backup/backup</code><code>.</code><code>tar</code> <code>/dbdata</code>

這裡我們建立并登入了一個新容器,挂載了dbdata容器中的資料卷,并把本地的一個目錄挂載了/backup下,最後再傳一條tar指令來備份dbdata卷到/backup下,當指令執行完成後容器就會停止運作,并保留dbdata的備份,在本地目錄下會一個備份的檔案

注:新建立的容器中要有tar指令,

得到備份資料就可以恢複或遷移資料了

本文轉自 ZhouLS 51CTO部落格,原文連結:http://blog.51cto.com/zhou123/1439895