设为首页 收藏本站
查看: 1143|回复: 0

[经验分享] 5.docker学习之容器

[复制链接]

尚未签到

发表于 2017-12-6 19:39:54 | 显示全部楼层 |阅读模式
容器创建
  我们已经知道,镜像是只读的,而基于镜像创建出来的容器是可读写的,所以,一般我们实际中,会经常使用对应镜像创建容器并且使用这些容器。同样,如果我们想要使用容器,那么我们必须首先需要创建容器。而且要知道一个镜像可以同时创建多个容器



[iyunv@206 /]# docker run -t -i ubuntu:17.10 /bin/bash

-t表示为容器分配一个伪终端

-i容器的标准输出为打开的状态

/bin/bash表示容器运行的地址

再执行一遍,就又创建一个容器
容器的启动
  容器的启动主要分为两种方式:


1、创建。

2、把终止状态的容器启动。   exit之后就是终止状态



[iyunv@206 /]# docker run -t -i ubuntu:17.10 /bin/bash
root@abc6e11de34e:/# exit
exit
  查看docker上所有的容器



[iyunv@206 /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
abc6e11de34e        ubuntu:17.10        "/bin/bash"              11 minutes ago      Exited (0) 50 seconds ago                       ecstatic_meitner
bcd455f0bc0f        cbf64eb48a64        "/bin/sh -c 'mkdir..."   3 hours ago         Exited (1) 3 hours ago                          xenodochial_minsky
2f90664d6391        cbf64eb48a64        "/bin/sh -c 'mkdir..."   3 hours ago         Exited (1) 3 hours ago                          amazing_kowalevski
  再次启动



[iyunv@206 /]# docker start abc6


[iyunv@206 /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS               NAMES
abc6e11de34e        ubuntu:17.10        "/bin/bash"              14 minutes ago      Up 2 seconds                                 ecstatic_meitner
bcd455f0bc0f        cbf64eb48a64        "/bin/sh -c 'mkdir..."   3 hours ago         Exited (1) 3 hours ago                       xenodochial_minsky
2f90664d6391        cbf64eb48a64        "/bin/sh -c 'mkdir..."   3 hours ago         Exited (1) 3 hours ago                       amazing_kowalevski
守护态运行
  Docker里的容器可以在后台以守护态的方式运行,这样可以方便我们对Docker的操作



[iyunv@206 /]# docker run -d ubuntu:17.10 /bin/bash -c "while true;do echo thanks;sleep 3;done"



这里我们创建了一个守护态运行的容器,并让他一直输出thanks

根据id查看容器的输出


[iyunv@206 /]# docker logs 9e48
thanks
thanks
thanks
thanks
thanks
thanks
thanks
thanks
...
终止
  假如我们暂时不想运行某个容器,我们可以终止该容器,终止之后,对应的容器将退出运行状态



[iyunv@206 /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS               NAMES
9e489b563341        ubuntu:17.10        "/bin/bash -c 'whi..."   2 minutes ago       Up 2 minutes                                 inspiring_hawking
abc6e11de34e        ubuntu:17.10        "/bin/bash"              25 minutes ago      Up 11 minutes                                ecstatic_meitner
bcd455f0bc0f        cbf64eb48a64        "/bin/sh -c 'mkdir..."   3 hours ago         Exited (1) 3 hours ago                       xenodochial_minsky
2f90664d6391        cbf64eb48a64        "/bin/sh -c 'mkdir..."   3 hours ago         Exited (1) 3 hours ago                       amazing_kowalevski
  这里有两个正在后面默默运行的容器



[iyunv@206 /]# docker stop 9e48
9e48
[iyunv@206 /]# docker stop abc6
abc6
[iyunv@206 /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
9e489b563341        ubuntu:17.10        "/bin/bash -c 'whi..."   4 minutes ago       Exited (137) 13 seconds ago                       inspiring_hawking
abc6e11de34e        ubuntu:17.10        "/bin/bash"              28 minutes ago      Exited (0) 8 seconds ago                          ecstatic_meitner
bcd455f0bc0f        cbf64eb48a64        "/bin/sh -c 'mkdir..."   3 hours ago         Exited (1) 3 hours ago                            xenodochial_minsky
2f90664d6391        cbf64eb48a64        "/bin/sh -c 'mkdir..."   4 hours ago         Exited (1) 4 hours ago                            amazing_kowalevski
依附容器
  我们可以使用Docker attach指令依附到某个容器中,通俗来说,就是指我们可以通过该指令进入某个容器。
  没有在运行的容器是不能依附的



[iyunv@206 /]# docker start abc6
abc6
[iyunv@206 /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
9e489b563341        ubuntu:17.10        "/bin/bash -c 'whi..."   10 minutes ago      Exited (137) 6 minutes ago                       inspiring_hawking
abc6e11de34e        ubuntu:17.10        "/bin/bash"              34 minutes ago      Up 2 seconds                                     ecstatic_meitner
bcd455f0bc0f        cbf64eb48a64        "/bin/sh -c 'mkdir..."   4 hours ago         Exited (1) 4 hours ago                           xenodochial_minsky
2f90664d6391        cbf64eb48a64        "/bin/sh -c 'mkdir..."   4 hours ago         Exited (1) 4 hours ago                           amazing_kowalevski


[iyunv@206 /]# docker attach abc6
root@abc6e11de34e:/#
  其实依附也就是进入一个容器而已

容器信息查看
  查看运行中的容器



[iyunv@206 /]# docker ps
  查看所有容器



[iyunv@206 /]# docker ps -a
  查看最后一次创建的容器



[iyunv@206 /]# docker ps -l
  查看运行中的容器的id号



[iyunv@206 /]# docker ps -q
  上面的查看守护容器的log



[iyunv@206 /]# docker logs 9e48
  实时查看



[iyunv@206 /]# docker logs -f 9e48
  只查看最新两行



[iyunv@206 /]# docker logs --tail=2 9e48
  只查看最新的两行,且不断实时查看



[iyunv@206 /]# docker logs --tail=2 -f 9e48
  附加产生log的具体时间



[iyunv@206 /]# docker logs  -t 9e48
容器内命令执行


容器内命令的执行方式有两种:

1.依附到对应容器,在对应容器中直接执行。

2.不进入对应容器,直接在主系统中通过docker exec指令对对应容器进行相关指令执行操作。而2又可分为:  2.1 后台执行



[iyunv@206 /]# docker exec -d abc6 touch /q.txt
[iyunv@206 /]# docker exec -d abc6  echo "123"
[iyunv@206 /]#
  2.2 交互执行



[iyunv@206 /]# docker exec -ti abc6 touch /w.txt
[iyunv@206 /]# docker exec -ti abc6  echo "123"
123









结果很明显了





docker exec -ti abc6 /bin/bash


这个比attach的好处是,不会exit就关闭容器


容器的导入导出
  我们已经学过如何将某个镜像导出成一个压缩文件,移植到其他环境中使用。同样,我们也可以将某个容器通过docker export指令导出为一个压缩文件,然后存储起来,在必要的时候可以根据该压缩文件恢复为容器



[iyunv@206 /]# docker export abc6 > abc6.tar



当我们想把某个容器的压缩文件导入恢复为容器的时候,我们需要通过docker import指令进行容器的导入操作。由于容器是基于镜像而创建的,其核心特征是在镜像上创建一层可写层。故而,容器的导入过程可以这样:首先把容器压缩文件快照导入为一个镜像,然后基于该镜像创建一个容器,则此时创建的新容器跟原容器性能一致,该过程即为容器的导入操作

首先把容器压缩文件快照导入为一个镜像




[iyunv@206 /]# cat abc6.tar | docker import - cba:v2
  查看镜像,发现多了一个



[iyunv@206 /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
cba                 v2                  7ee75c306951        48 minutes ago      78.5 MB
<none>              <none>              cbf64eb48a64        6 hours ago         89.6 MB
newsuse             99999               7e4ff5f67461        6 hours ago         156 MB
newubuntu           8888                036d21b62a12        6 hours ago         89.6 MB
ubuntu              17.10               073e7b409b9b        43 hours ago        89.6 MB
itliucheng/ubuntu   first               073e7b409b9b        43 hours ago        89.6 MB
  创建容器





[iyunv@206 /]# docker run  -ti cba:v2 /bin/bash
  虽然容器号不一样了,但是内容是完全一样的



数据卷


我们以后在学习Docker容器的时候,那么容器可能会出现多个,同样,每个容器中都会涉及数据,自然,我们就要研究如何对这些数据进行管理。管理容器中数据的方式主要有2种:

1.数据卷

2.数据卷容器



数据卷是一个可以供一个容器或者多个容器使用的特殊目录,该目录利用容器的UFS文件系统可以为容器提供一些稳定的特性或者数据共享,类似于Linux系统下的mount(挂载命令)




数据卷主要有4个性能:

1.数据卷可以在容器之间共享和重用

2.对数据卷的修改会立马生效

3.对数据卷的更新,不会影响镜像

4.卷会一直存在,直到没有容器使用

数据卷创建


[iyunv@206 ~]# docker run -ti -v /abctest ubuntu:17.10 /bin/bash
  -v就是创建数据卷参数,并且挂载到指定的容器里



root@f109cdc59516:/# ls
abctest  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
挂载

我们在容器中创建了数据卷之后,可以把母机器中的某个目录或某个文件挂载到数据卷中,这样,这个目录或文件与容器中的数据卷内容就相当于是一个了。





[iyunv@206 ~]# cd /
[iyunv@206 /]# mkdir gztest
[iyunv@206 /]# cd gztest/
[iyunv@206 gztest]# touch a.txt
  创建容器并挂载 将母机的gztest挂载到 容器中的contest中





[iyunv@206 gztest]# docker run -ti -v /gztest:/contest ubuntu:17.10 /bin/bash
root@9647eb0d2898:/# ls
bin  boot  contest  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@9647eb0d2898:/# cd contest/
root@9647eb0d2898:/contest# ls
a.txt
  延伸:如果创建的容器有权限限制,就修改成这样创建容器docker run -ti -v /gztest:/contest --privileged=true ubuntu:17.10 /bin/bash  再或者关闭selinux 命令为: setenforce 0


同理,刚才是挂载文件夹,挂载文件同理




docker run -ti -v /file.txt:/co/b.txt ubuntu:17.10 /bin/bash
数据卷容器






所谓的数据卷容器,其实质上,是容器,但是这个容器是一个专门用来提供数据卷的容器。

     那么,为什么要有数据卷容器呢?

因为有的时候,我们会有一些数据需要持续更新,并且这些数据需要在容器间进行共享,那么此时,如果有一个专门的容器来提供数据卷,将会方便很多。所以,如果我们要解决数据的持久化问题,我们应当选用数据卷容器

创建一个数据卷容器,设置了容器名称为datac1




[iyunv@206 /]# docker run -ti -v /abc --name datac1 ubuntu:17.10 /bin/bash


[iyunv@206 /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
b2e8f642c525        ubuntu:17.10        "/bin/bash"              17 seconds ago      Exited (0) 8 seconds ago                        datac1
9647eb0d2898        ubuntu:17.10        "/bin/bash"              27 minutes ago      Exited (0) 14 minutes ago                       focused_jang
f109cdc59516        ubuntu:17.10        "/bin/bash"              34 minutes ago      Exited (0) 32 minutes ago                       stupefied_curie
6d8a8372d68b        cba:v2              "/bin/bash"              3 hours ago         Up 3 hours                                      unruffled_agnesi
9e489b563341        ubuntu:17.10        "/bin/bash -c 'whi..."   6 hours ago         Exited (137) 5 hours ago                        inspiring_hawking
abc6e11de34e        ubuntu:17.10        "/bin/bash"              6 hours ago         Up 5 hours                                      ecstatic_meitner
bcd455f0bc0f        cbf64eb48a64        "/bin/sh -c 'mkdir..."   9 hours ago         Exited (1) 9 hours ago                          xenodochial_minsky
2f90664d6391        cbf64eb48a64        "/bin/sh -c 'mkdir..."   9 hours ago         Exited (1) 9 hours ago                          amazing_kowalevski
  创建另外一个普通容器,并挂载数据卷容器



[iyunv@206 /]# docker run -ti --volumes-from b2e8 --name testcommon ubuntu:17.10 /bin/bash
root@f99f555cfac5:/# ls
abc  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var





这里可以用--volumes-from b2e8  也可以用--volumes-from bdatac1

我们可以看到普通容器中有一个abc文件夹,这个就是数据卷容器中的文件夹

在abc中创建文件,attach到数据卷容器中会发现这个 abc文件夹中也有新创建的文件


数据迁移




我们在这里所说的数据迁移,是指在有必要的时候,将数据卷容器的数据卷中的数据全部转移到一个新的地方。我们实现迁移的原理是:首先将数据卷容器的相应数据卷进行备份,然后将备份文件保存起来,在有需要的时候,再将备份文件恢复为原来的数据卷,并且数据卷里面的内容要完整保存



要想对数据卷里面的内容进行备份,我们可以这样做:加载源数据卷容器里面的数据卷,并在新的容器中把加载过来的数据卷归档存放,在进行以上操作的同时,将当前目录挂载到新容器存放归档文件的目录中,这样就可以直接在当前文件取到对应的压缩文件了。

意思就是 :创建一个普通容器,并挂载数据卷容器,同时这个普通容器还挂载了母机的一个文件夹,这样普通容器能操作数据卷,压缩数据卷后放入母机关联的文件夹,这样在母机上也能操作




[iyunv@206 /]# docker run -ti -v /abcd --name abc ubuntu:17.10 /bin/bash
root@42fae694e443:/# ls
abcd  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@42fae694e443:/# cd abcd/
root@42fae694e443:/abcd# touch a.txt&&touch b.txt
root@42fae694e443:/abcd# ls
a.txt  b.txt
  创建普通容器



[iyunv@206 /]# docker run -ti --volumes-from 42fa -v /gztest:/backup --name backcontainer ubuntu:17.10 tar cvf /backup/task1.tar /abcd
  母机上



[iyunv@206 /]# cd gztest/
[iyunv@206 gztest]# ls
a.txt  task1.tar
  数据恢复就不说了,在建立一个容器,将母机文件所在目录挂载到容器的目录中



容器命名
  从之前到现在,创建了很多的容器



[iyunv@206 /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                     NAMES
c977c2f4e1a9        ubuntu:17.10        "/bin/bash"              24 minutes ago      Up 24 minutes               0.0.0.0:32769->8998/tcp   net2
e617f1cd394d        ubuntu:17.10        "/bin/bash"              25 minutes ago      Exited (0) 25 minutes ago                             net1
dbb53a5ddc3e        ubuntu:17.10        "tar cvf /backup/t..."   50 minutes ago      Exited (0) 50 minutes ago                             backcontainer
42fae694e443        ubuntu:17.10        "/bin/bash"              57 minutes ago      Exited (0) 56 minutes ago                             abc
f99f555cfac5        ubuntu:17.10        "/bin/bash"              13 hours ago        Exited (0) 13 hours ago                               testcommon
b2e8f642c525        ubuntu:17.10        "/bin/bash"              13 hours ago        Exited (0) 13 hours ago                               datac1
9647eb0d2898        ubuntu:17.10        "/bin/bash"              14 hours ago        Exited (0) 13 hours ago                               focused_jang
f109cdc59516        ubuntu:17.10        "/bin/bash"              14 hours ago        Exited (0) 14 hours ago                               stupefied_curie
6d8a8372d68b        cba:v2              "/bin/bash"              17 hours ago        Exited (255) 2 hours ago                              unruffled_agnesi
9e489b563341        ubuntu:17.10        "/bin/bash -c 'whi..."   19 hours ago        Exited (137) 19 hours ago                             inspiring_hawking
abc6e11de34e        ubuntu:17.10        "/bin/bash"              20 hours ago        Exited (255) 2 hours ago                              ecstatic_meitner
bcd455f0bc0f        cbf64eb48a64        "/bin/sh -c 'mkdir..."   23 hours ago        Exited (1) 23 hours ago                               xenodochial_minsky
2f90664d6391        cbf64eb48a64        "/bin/sh -c 'mkdir..."   23 hours ago        Exited (1) 23 hours ago                               amazing_kowalevski
  我们先根据容器id查一下容器名称



[iyunv@206 /]# docker inspect -f "{{.Name}}" 2f90
/amazing_kowalevski
  docker不允许容器同名。若出现同名
  1、先删除原容器,再创建新容器。



[iyunv@206 /]# docker rm amazing_kowalevski
  把容器名换成id一样
  2、使用--rm标记,一旦容器退出,自动删除容器



[iyunv@206 /]# docker run -ti --name advc --rm ubuntu:17.10
  exit之后容器已经删除了

网络服务


Docker可以提供网络服务。

Docker提供网络服务,主要有两种方式:
1、外部访问


    我们在Docker的容器中,可以运行一些网络应用,比如WEB应用等,如果这些应用需要跟外界进行交互,那么一般使用外部访问容器的方式进行。主要会通过端口映射的方式解决。


[iyunv@206 /]# docker run -t -P --expose 8998 --name net2 ubuntu:17.10
  -P表示可以外部访问
  --expose绑定端口



[iyunv@206 /]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
c977c2f4e1a9        ubuntu:17.10        "/bin/bash"         12 seconds ago      Up 11 seconds       0.0.0.0:32769->8998/tcp   net2
  所以我们可以浏览器192.168.126.206:32769来访问该服务,由于容器里并没有什么web项目,所以访问也没效果



[iyunv@206 /]# docker port net2 8998
0.0.0.0:32769
  还可以这样 小写的p



[iyunv@206 /]# docker run -t -p 192.168.126.205:8999:5001 --name net3 ubuntu:17.10
  他表示访问192.168.126.206:8999来访问容器的5001端口
  2、容器互联
  容器互联的方式会在接收容器与源容器间创建一个隧道,接收容器可以看到源容器的指定信息
  创建源容器



[iyunv@206 /]# docker run -ti --name hl1 ubuntu:17.10
[iyunv@206 /]# docker start hl1
  创建接收容器



[iyunv@206 /]# docker run -ti --name hl2 --link hl1:yuan1 ubuntu:17.10



:yuan1表示给源容器起的别名,可以不加

此时这两个容器就算是互联了



我们在进行了容器互联之后,有时我们需要查找某些容器的互联信息,此时我们就要进行连接信息的公开。

      一般,要公开连接信息,有两种方式

1、hosts文件法  我们可以进入连接容器,也就是接收容器,然后找到/etc/hosts文件,并cat查看,即可以把该容器的连接信息公开出来,包括该连接容器对应的源容器信息等。公开之后,我们可以使用ping命令测试连接是否通畅。



root@7a9dee156249:/# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3      yuan1 30bd2045b737 hl1
172.17.0.4      7a9dee156249
  执行 ping 172.17.0.3  或者  ping hl1 即可
  2、环境变量法



[iyunv@206 /]# docker run -ti --name hl3 --link hl1:yuan2 ubuntu:17.10 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=7a91ce8a9480
TERM=xterm
YUAN2_NAME=/hl3/yuan2
HOME=/root
Dockerfile的使用
  这是以前学的只用Dockerfile创建镜像



[iyunv@206 test]# touch Dockerfile
FROM newubuntu:8888
MAINTAINER root
RUN touch a.txt
RUN mkdir test1
  CMD:执行docker run时执行某行指令,具有替换性



FROM ubuntu:17.10
MAINTAINER root
CMD ["echo"]
[iyunv@206 test]# docker build -t="copyubuntu" /test
[iyunv@206 /]# docker run -ti copyubuntu echo hello
hello
  ENTRYPOINT:执行docker run时执行某行指令,不具有替换性



[iyunv@206 test]# vi Dockerfile
FROM ubuntu:17.10
MAINTAINER root
ENTRYPOINT ["echo"]


[iyunv@206 /]# docker build -t="copyubuntu1" /test
[iyunv@206 /]# docker run -ti copyubuntu1 echo hello
echo hello



USER:使用哪个用户运行容器

EXPOSE:绑定哪个内部端口,构建镜像的时候,开启哪个端口

ENV:环境变量设置,构建镜像的时候添加环境变量配置

ADD: 跟copy类似 ,将本机某个文件,在生成镜像的时候,放入镜像中,同时add有另外的解压功能,也就是拷贝进去后会自动解压

COPY :从本地复制文件到镜像中

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-421433-1-1.html 上篇帖子: flannel 概述 下篇帖子: docker镜像
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表