Docker环境安装以及基本使用

来源:互联网 发布:医疗软件实施工程师 编辑:程序博客网 时间:2024/05/28 16:21

认识Docker

Docker 是一个开源的应用容器引擎,主要利用 linux 内核 namespace 实现沙盒隔离,用cgroup 实现资源限制。

Docker 支持三种不同的镜像层次存储的 drivers: aufs devicemapper、btrfs ;

AUFS (AnotherUnionFS) 是一种 Union FS, 简单来说就是支持将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)的文件系统。 Aufsdriver 是 docker 最早支持的 driver,但是 aufs 只是 linux 内核的一个补丁集而且不太可以会被合并加入到 linux内核中。但是由于 aufs 是唯一一个 storage driver 可以实现容器间共享可执行及可共享的运行库, 所以当你跑成千上百个拥有相同程序代码或者运行库时时候,aufs是个相当不错的选择。Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略。Device mapper driver 会创建一个 100G 的简单文件包含你的镜像和容器。每一个容器被限制 在 10G 大 小 的 卷 内 。 Btufs driver 在 docker build 可以很高效。但是跟 devicemapper 一样不支持设备间共享存储(文档里是 does not share executable memory between devices)。在没有 aufs 支持的 linux 发行版本上 (CentOS,opensuse 等 )安装 docker 可能就使用了devicemapper driver。

实验环境:

Redhat enterprise release 7.2 x86_64bit

1、 安装Docker

百度盘地址https://pan.baidu.com/s/1slqgGjF,安装前请先配置好yum源,因为需要安装许多依赖

yum install docker-engine-1.10.3-1.el7.centos.x86_64.rpm -y

这里写图片描述

Docker 在启动时会创建一个虚拟网桥 docker0,默认地址为 172.17.0.1/16, 容器启动后都会被桥接到 docker0 上,并自动分配到一个 IP 地址,如果想要修改默认的地址可以进行以下操作:

这里写图片描述

[root@lockey6 ~]# cp /usr/lib/systemd/system/docker.service /etc/systemd/system/[root@lockey6 ~]# vim /etc/systemd/system/docker.service 

添加以下红线画出内容,只要是符合规范且不和你的物理机处于同一网段的ip都可以
这里写图片描述

当然以上是永久修改,如果只是想要暂时生效的话可以执行以下操作:

# systemctl stop docker# ip link set dev docker0 down# ip addr del 172.17.42.1/24 dev docker0# ip addr add 192.168.0.1/24 dev dcoker0# ip link set dev docker0 up

然后应用最新设置:

[root@lockey6 ~]# systemctl daemon-reload [root@lockey6 ~]# systemctl restart docker

这里写图片描述

2、容器使用

镜像用来创建容器,是容器的只读模板,默认可以从 docker hub 上下载。docker 的镜像是增量修改,每次创建新的镜像都会在父镜像上构建一个增量的层,基于 AUFS 技术。# docker search 查询镜像# docker pull 拉取镜像# docker push 推送镜像

假设我们已经有一个名为nginx.tar的镜像

[root@lockey6 ~]# docker load -i nginx.tar #导入镜像[root@lockey6 ~]# docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEnginx               latest              af4b3d7d5401        19 months ago       190.5 MB

以下为一些常用命令解释,不做操作演示:

# docker run -it --name vm1 ubuntu bash创建容器# docker ps -a查看容器进程# docker attach vm1连接容器# docker top vm1查看容器进程# docker logs vm1 查看容器指令输出 -f 参数可以实时查看# docker inspect vm1 查看容器详情# docker stats vm1 查看容器资源使用率# docker diff vm1 查看容器修改开启容器[root@foundation5 ~]# docker start vm1#restart/stop/vm1[root@foundation5 ~]# docker attach vm1# docker pause/unpause vm1暂停/恢复容器倒入镜像docker load -i ubuntu.tar导出镜像docker save ubuntu > ubuntu.tar保存对镜像的更改[root@foundation5 ~]# docker commit -m 'add files' -p vm1 newubuntu删除镜像[root@foundation5 ~]# docker rm vm1vm1[root@foundation5 ~]# docker rmi newubuntu查看镜像docker inspect ubuntuctrl+p+q退出镜像再次进入镜像[root@foundation5 ~]# docker attach vm1docker exec vm1 ls /docker cp /test.py ./#从docker往镜像中拷贝数据[root@foundation5 ~]# docker cp vm1:/halo.log ./#从镜像中往docker中导出数据docker history ubuntu查看镜像[root@foundation5 ~]# docker export vm1 > halo.tar[root@foundation5 ~]# docker import  halo.tar halo[root@foundation5 ~]# docker load -i game2048.tar [root@foundation5 ~]# docker run -d -p 8080:80 --name 2048 game20481c8d01d0a1baca0e655b4ac41b73c70cb75fc7a51e0bba2fdc0fd22a6d3a905d

3、数据卷管理

[root@foundation5 data2]# docker rm `docker ps -aq`4eadabad7d9affec847ffc40Failed to remove container (1c8d01d0a1ba): Error response from daemon: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f[root@foundation5 data2]# docker create --name datadir -v /tmp/data1:/data1 -v /tmp/data2:/data2 ubuntu9fbece05806cda542151ead5d588b47066a80a55a66fee60d6c663da2256dc45[root@foundation5 data2]# docker ps -aCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES9fbece05806c        ubuntu              "/bin/bash"         9 seconds ago       Created                                 datadir[root@foundation5 data2]# [root@foundation5 data2]# docker run -it --name vm1 --volumes-from=datadir ubunturoot@2abd2ace7f15:/# lsbin  boot  data1  data2  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  varroot@2abd2ace7f15:/# cd data2root@2abd2ace7f15:/data2# lspasswdroot@2abd2ace7f15:/data2# [root@foundation5 data2]# docker run --rm --volumes-from=datadir -v /tmp/backup:/backup ubuntu tar -zcf /backup/test.tgz /data2/tar: Removing leading `/' from member names[root@foundation5 tmp]# cd /tmp/backup/[root@foundation5 backup]# lstest.tgz[root@foundation5 backup]# [root@foundation5 backup]# docker run --rm --volumes-from=datadir -v /tmp/backup:/backup ubuntu rm -f /backup/test.tgz#继续在docker中调用命令删除刚才创建的压缩文件Docker容器中进程号为1的进程是bash,而不是init,一个运行的Linux竟然没有init进程,简直太不思议了。这其实得益于强大的Linux提供的LXC功能。[root@foundation5 ~]# docker run -it --name vm1 --net host ubuntu#修改docker的网络模式