天天看点

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