Docker技术的使用

Docker是一种基于容器的虚拟化技术,Docker应用场景1、面向产品,2、面向开发,3、面向测试,4、面向运维,5、面向自定化,6、面向微服务,7、面向大规模的分布式架构。

一、Docker的命令操作

1、查看本地的Docker镜像

docker images
#新安装的Docker容器还没有如何镜像
[root@webserver ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
#仓库名称           镜像标签            镜像ID              镜像创建时间        版本     镜像大小

2、搜索远程的Docker hub上的公有镜像

搜索Docker hup上的centos系统

docker search centos
#镜像的名称                   镜像的描述                             星级(受欢迎程度) 是否为官方  是否是自动构建
NAME                          DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                        The official build of CentOS.                   2469      [OK]       
jdeathe/centos-ssh            CentOS-6 6.8 x86_64 / CentOS-7 7.2.1511 x8...   26                   [OK]
nimmis/java-centos            This is docker images of CentOS 7 with dif...   13                   [OK]
million12/centos-supervisor   Base CentOS-7 with supervisord launcher, h...   12                   [OK]
consol/centos-xfce-vnc        Centos container with "headless" VNC sessi...   10                   [OK]
torusware/speedus-centos      Always updated official CentOS docker imag...   8                    [OK]
nickistre/centos-lamp         LAMP on centos setup                            4                    [OK]
nathonfowlie/centos-jre       Latest CentOS image with the JRE pre-insta...   3                    [OK]
centos/mariadb55-centos7                                                      3                    [OK]
consol/sakuli-centos-xfce     Sakuli end-2-end testing and monitoring co...   2                    [OK]
timhughes/centos              Centos with systemd installed and running       1                    [OK]
blacklabelops/centos          CentOS Base Image! Built and Updates Daily!     1                    [OK]
#用户名/项目名称 

3、下载一个Docker hub上的镜像

docker pull treasureboat/centos6#docker pull 镜像名称
#pull下载的镜像仓库经常会断,可以修改一个国内的免费镜像地址
#vim /etc/sysconfig/docker
#修改内容为
other_args="--registry-mirror=http://aad0405c.m.daocloud.io"
#重启docker服务

4、启动一个容器HelloWorld

docker run --name mycentos -h mycentos 09365809850b /bin/echo "HelloWorld"

docker run -it --name mycentos2 -h mycentos 09365809850b /bin/bash#启动一个容器并进入容器
#docker run背后做什么操作了?
#docker首先会去检查系统中是否存在centos这样一个镜像,如果不存在则到Docker hup上去下载,然后会检查系统中是否已经启动过--name的容器如果有的话,则不会让你
#创建成功,当容器创建成功之后,Docker会在只读的文件镜像上分配可写的文件系统共用户操作。
#Docker会运行一个你指定的应用程序,应用程序如果退出了,容器也就退出了。所以每个容器只启动一个应用程序(如果要启动多个应用程序可以写脚本实现)

#退出当前的容器
#exit

#如何启动一个当前已终止的容器了?

#docker start 2a9ff393b720

#如何启动一个容器在后台运行
docker run -d --name mynginx nginx

#通过attach来进入一个容器,某些时候或某些容器通过这种方式是无法进入的,我们可以通过nsenter命令进入(nsenter命令在util-linux软件包中)

docker attach 72dcdd5e5136

#通过yum来安装此命令
yum -y install util-linux
#此命令的参数是容器的PID,首先需要获取容器的PID
                                          参数为容器的名称/容器ID
docker inspect --format "{{.State.Pid}}" mynginx
docker inspect --format "{{.State.Pid}}" 72dcdd5e5136
#进入容器此方式进入容器当你exit退出的时候容器不会结束
nsenter --targer "$CPID" --mount --uts --ipc -- net --pid
#因此需要频繁进入容器可以写一个进入容器的脚本
#vim /opt/in.sh

#!/bin/bash
CNAME=$1
CPID=$(docker inspect --format "{{.State.Pid}}" $CNAME)
nsenter --targer "$CPID" --mount --uts --ipc -- net --pid


#启动一个已经关闭的容器
             容器的ID
docker start 72dcdd5e5136

#-i 让终端保持打开的状态
#-t(tty) 启动一个tty
#-h 启动一个主机名 
-------------------------------------------------------
<span style="color:#FF0000;">[root@webserver ~]# docker run -it --name mycentos -h mycentos 09365809850b /bin/bash
Error response from daemon: Conflict. The name "mycentos" is already in use by container 2a9ff393b720. You have to delete (or rename) that container to be able to reuse that name.
启动一个容器如果名称重复则不让创建</span>

 
5、查看之前启动过的容器

docker ps -a
[root@webserver ~]# docker ps -a
#容器ID             镜像              执行命令            创建时间            容器状态                    容器端口            容器名称
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
2a9ff393b720        09365809850b        "echo HelloWorld"   53 seconds ago      Exited (0) 51 seconds ago                       mycentos

6、停止docker容器

docker stop b26664cb59be

7、删除docker容器

docker rm b26664cb59be

二、Docker网络访问

用户下载一个官方的nginx服务镜像并运行起来,在宿主机上是不能访问的,所有需要容器和宿主机进行一个ip、端口之间的映射才可以访问容器,容器和宿主机之间的映射有两种方式。如何访问docker容器中的网络组件?

brctl show

查看到一个docker0的网桥

iptables -t nat -L -n

在Docker容器中查看路由表信息

ip ad li
ip ro li

1、第一种方式是端口的随机映射docker run -P

[root@webserver ~]# docker run -d -P --name mynginx nginx
1a35ce2be3ef1724add46bdd08b807d8267652245582f3786ab88ec01333630a
[root@webserver ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                                           NAMES
1a35ce2be3ef        nginx               "nginx -g 'daemon of   10 seconds ago      Up 8 seconds        <span style="color:#FF0000;">0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp</span>   mynginx

可以查看端口的映射  宿主机端口-->容器端口

2、第二种方式是指定映射

-p hostPort:containerPort
-p ip:hostPort:containerPort
-p ip::containerPort
#可以指定多-p端口映射
-p hostPort:containerPort
-p hostPort:containerPort
[root@webserver ~]# docker run -d -p 90:80 --name mynginx2 nginx
928a3a9a6cef9fe42738d37220fd246bdacf5944c9a51e964c0d251dcc09acba
[root@webserver ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                         NAMES
928a3a9a6cef        nginx               "nginx -g 'daemon of   11 seconds ago      Up 10 seconds       443/tcp, 0.0.0.0:90->80/tcp   mynginx2            

三、Docker数据管理

docker镜像是只读的,那么docker的数据写在哪里了?
docker的container内管理数据以及如何在不同的container间共享数据。
主要有两种方式管理数据
一、Data volumes(数据卷    -v /data    -v src:dst(它绕过了ufs))
    1、一个 data volume 就是一个在一个或者多个container里的特殊用途的目录。它绕过了 Union File System 为持久化数据、共享数据提供了下面这一些有用的特性:
    2、Data volumes 可以在不同的container之间共享和重用数据
    3、对 Data volume 的修改及时生效
    4、对 data volume 修改内容在升级image的时候不会被包括进去 (在docker的整个设计中image是一个无状态的, 这样对升级重用非常有利。而标记状态的数据, 比如数据库的数据, 生产的log之类的应该放到volume里。是通过文件的形式的, 而不是通过image)
    5、Volumes 的持久化直到没有container使用他们

#将容器的/dockerdata目录映射到宿主机的物理目录中
docker run -d --name volume-test1 -h nginx -v /dockerdata nginx
#查看Docker容器中/dockerdata映射到宿主机中的什么位置?
#                              容器名称/容器ID
docker inspect -f {{.Volumes}} volume-test1
#映射的目录信息map[/dockerdata:/var/lib/docker/volumes/dcdb2a6ac31a0068dc691d3dc6543068b11314a6c00dbbe1a5afd57444b20113/_data]
#这个映射的目录在宿主机上路径非常长,不利于我们管理,可以将容器的的目录映射到宿主机指定的目录  -v src:dst(它绕过了ufs)
docker run -d --name volume-test2 -h nginx -v /dockerdata:/dockerdata nginx
#                                             /源目录:/目标目录
#注意挂载的目录最后面不能跟反斜线
docker run -it --name volume-test2 -h nginx -v /opt:/opt:ro centos#docker目录只读
docker run -it --name volume-test2 -h nginx -v /etc/hosts:/etc/hosts centos#docker还可以挂载文件
二、数据卷容器
如果你有一些持久化的数据, 并且想在不同的container之间共享这些数据, 或者想在一些没有持久化的container中使用, 最好的方法就是使用 Data Volumn Container, 在把数据mount到你的container里.(译者:如开篇译者提到的docker的container是无状态的, 也就是说标记状态的数据,例如:数据库数据, 应用程序的log 等等, 是不应该放到container里的, 而是放到 Data Volume Container里, 这点和funcational programming很像, 所以我喜欢把一般的docker container 叫做 functional container用来区分 data volume container )

docker run -it --name volume-test4 --volumes-from volume-test centos
#volume-test4的docker容器可以挂载到另volume-test的docker容器,这个可以实现两个容器的数据共享,
#当volume-test容器关闭了也不会影响到volume-test4容器的访问数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值