-
Docker 容器
2017-07-27 08:22:20简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑...新建容器需要的命令为docker run ,启动已经终止的容简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。容器和镜像的关系就如,实例与类的关系.
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。新建容器需要的命令为docker run ,启动已经终止的容器 使用命令 docker start,其实从生命周期来看,docker run命令包含create 和start两个生命周期节点.
终止容器可以使用 docker stop来终止一个运行中的容器.此外,当docker容器中指定的应用终结时,容器也自动终止.
进入容器可以使用命令 docker attach,但是使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。 还可以使用ssh的方式进入容器(将容器的22端口暴露,然后直连),还可以使用nsenter的方式进入,当然这里需要版本要求.最后其实最常用的方式是docker exec的方式进入docker容器.
导出容器可以使用docker export命令,这样可以导出容器快照版本, 当然快照版本的导入可以使用 docker Import命令
删除容器可以使用 docker rm命令.如果要删除一个运行中的命令可以添加 -f参数.用 docker ps -a 命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用docker rm$(docker ps -a -q) 可以全部清理掉 (包括正在运行的容器)
-
Docker 容器化技术介绍(六) 之 Docker 容器操作
2018-08-24 23:50:33Docker 容器化技术介绍(一) 之 虚拟化技术 Docker 容器化技术介绍(二) 之 Docker 简介 Docker 容器化技术介绍(三) 之 Docker 组件 Docker 容器化技术介绍(四) 之 Docker的安装与启动 Docker 容器化技术...Docker 容器化技术介绍(四) 之 Docker的安装与启动
Docker 容器化技术介绍(五) 之 Docker 镜像操作
Docker 容器化技术介绍(六) 之 Docker 容器操作
Docker 容器化技术介绍(七) 之 Docker 应用部署
Docker 容器化技术介绍(八) 之 Docker 备份与迁移
1 查看容器
查看正在运行的容器
docker ps
[root@bogon home]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
列的介绍
名称 含义 CONTAINER ID 容器的 ID IMAGE 创建容器时所使用的镜像 COMMAND 运行容器中的软件执行的命令 CREATED 容器的创建时间 STATUS 容器的状态: UP 表示运行状态 Exited 表示关闭状态 PORTS 宿主机端口和容器中软件的端口的对应关系 NAMES 容器的名称 查看所有的容器(包含了正在运行的容器以及之前启动过的容器)
docker ps -a
[root@bogon home]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bff4ff3bd48a redis "docker-entrypoint..." 14 minutes ago Up 14 minutes 0.0.0.0:6379->6379/tcp th_docker_redis 5de5bd344823 nginx "nginx -g 'daemon ..." 17 minutes ago Up 17 minutes 0.0.0.0:80->80/tcp th_docker_nginx 7201b7a695c1 tomcat "catalina.sh run" 22 minutes ago Up 22 minutes 0.0.0.0:8099->8080/tcp th_docker_tomcat 289582afa5ad mysql "docker-entrypoint..." 42 minutes ago Up 42 minutes 33060/tcp, 0.0.0.0:33306->3306/tcp th_docker_mysql
查看最后一次运行的容器
docker ps -l
[root@bogon home]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bff4ff3bd48a redis "docker-entrypoint..." 15 minutes ago Up 15 minutes 0.0.0.0:6379->6379/tcp th_docker_redis
查看停止的容器
docker ps -f status=exited
[root@bogon home]# docker ps -f status=exited CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5de5bd344823 nginx "nginx -g 'daemon ..." 19 minutes ago Exited (0) 3 seconds ago th_docker_nginx
2 创建与启动容器
2.1创建容器参数介绍
创建容器的时候我们需要使用如下命令进行容器的创建
docker run
在创建容器的时候我需要使用一下参数.其中常用到的参数如下:
参数名称 参数含义 -i 运行容器 -t 表示容器启动后会进入其命令行,加入这两个参数后,容器创建就能登录进去;即分配一个伪终端 -d 在 run 后面加上-d 参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t 两个参数,创建后 就会自动进去容器) --name 为创建的容器命名 -v 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v 做多个目录或文件映射;注意:最好 做目录映射,在宿主机上做修改,然后共享到容器上 -p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口;可以使用多个-p 做多个端口映射 -d 表示让容器在后台运行起来, -t 表示创建好容器以后我们就指定进行到容器中,进入到容器中以后我们就可以输入命令和容器进行交互. 既然如此,那么也就是说容器我们可以分为两类: 1. 交互式容器 2. 守护式容器
2.2 创建交互式容器
创建一个交互式容器并取名为 th_centos
docker run -it --name=th_centos centos /bin/bash
这样就可以直接运行到 th_centos 这个 docker 的容器里面了
[root@bogon home]# docker run -it --name=th_centos centos /bin/bash [root@d8099a455a84 /]#
使用 ps 命令查看容器的状态,状态为 Up
[root@bogon ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 690301d8ba86 centos "/bin/bash" 8 seconds ago Up 7 seconds th_centos
使用 exit 退出容器
然后在查看容器状态,状态为 Exited
[root@bogon home]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d8099a455a84 centos "/bin/bash" 5 minutes ago Exited (127) 3 minutes ago th_centos
我们容器也关闭了,这就是交互式容器的特点: 当我们推出容器以后,容器就关闭了
2.3 创建守护式容器
创建一个守护式容器:如果对于一个需要长期运行的容器来说,可以创建一个守护式容器。命令如下(容器名称不能重复):
docker run -id --name=th_centos_3 centos
[root@bogon home]# docker run -id --name=th_centos_3 centos 9938e58f17b5a601e9eb2c7eaf5edc27b3484d5778a24c63efa1029736735616
创建好容器以后,这个容器是以后台的方式运行的,那么需要操作容器就需要登录到容器中,可以使用如下命令进行登录
docker exec -it container_name (container_id) /bin/bash
[root@bogon home]# docker exec -it th_centos_3 /bin/bash [root@9938e58f17b5 /]# ls anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var [root@9938e58f17b5 /]# ps PID TTY TIME CMD 7 ? 00:00:00 bash 22 ? 00:00:00 ps
退出以登录的容器,然后在查看容器的状态
[root@bogon home]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9938e58f17b5 centos "/bin/bash" 2 minutes ago Up 2 minutes th_centos_3
发现容器还是处于运行状态,因此可以总结出守护式容器的特点: 即使退出容器以后,容器还是处于运行状态
3 停止与启动容器
关闭容器
docker stop $CONTAINER_NAME/ID
可以发现容器状态由 Up 转为 Exited
[root@bogon home]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9938e58f17b5 centos "/bin/bash" 2 minutes ago Up 2 minutes th_centos_3 [root@bogon home]# docker stop th_centos_3 th_centos_3 [root@bogon home]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9938e58f17b5 centos "/bin/bash" 4 minutes ago Exited (137) 7 seconds ago th_centos_3
启动已经关闭的容器
docker start $CONTAINER_NAME/ID
可以发现容器状态由 Exited 转为 Up
[root@bogon home]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9938e58f17b5 centos "/bin/bash" 4 minutes ago Exited (137) 7 seconds ago th_centos_3 [root@bogon home]# docker start th_centos_3 th_centos_3 [root@bogon home]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9938e58f17b5 centos "/bin/bash" 5 minutes ago Up 5 seconds th_centos_3
执行批量stop停止容器
xubinbin.5808@n226-201-061:~$ docker ps -a | awk '{print $1}'|xargs docker stop 135eea9d3262 9e447bde69f9 51fe3b604152 96150ea01aba b81aeea8eecc dd5e2f3f358e 978262406dd7 06d5df6ef604 47fadc55cef5 090509c25216 fa736e6b084c f6cbd18584f0 d112a9038620
执行批量rm删除容器
xubinbin.5808@n226-201-061:~$ docker ps -a | awk '{print $1}'|xargs docker rm 135eea9d3262 9e447bde69f9 51fe3b604152 96150ea01aba b81aeea8eecc dd5e2f3f358e 978262406dd7 06d5df6ef604 47fadc55cef5 090509c25216 fa736e6b084c f6cbd18584f0 d112a9038620 da1e325b81c1
4 文件拷贝
有的时候我们需要将某一个文件复制到容器中,然后在容器中进行时候,那么我们就需要了解一下如何进行文件的拷贝;
如果我们需要将文件拷贝到容器内可以使用 cp 命令
docker cp 宿主机对应的文件/或者目录 容器名称:容器目录
[root@bogon home]# docker cp /mtfs/media/1080P_daxiongtu_30fps_2D_30s.flv th_centos_3:/opt/ [root@bogon home]# docker exec -it th_centos_3 /bin/bash [root@9938e58f17b5 /]# ls /opt -lh total 11M -rw-r--r-- 1 root root 11M Jun 14 03:27 1080P_daxiongtu_30fps_2D_30s.flv
我们也可以将容器中的某一个文件或者文件夹拷贝到宿主机上
docker cp 容器名称:容器目录 需要拷贝的文件或目录
[root@bogon home]# docker cp th_centos_3:/opt/1080P_daxiongtu_30fps_2D_30s.flv /home [root@bogon home]# ls /home/ 1080P_daxiongtu_30fps_2D_30s.flv th
5 目录挂载
在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样就可以通过修改宿主机某个目录的文件从而去影响容器;
命令的格式为: 创建容器 添加 -v 参数 后边为 宿主机目录:容器目录
docker run -id -v /mtfs/media/:/opt --name=th_centos_4 centos
然后进入容器中查看 /opt 目录下是否存在一个 /mtfs/media中的数据
[root@bogon home]# docker run -id -v /mtfs/media/:/opt --name=th_centos_4 centos d2e756a08a0b6f1a5ded8a385cafe1614fdb3909723075025f79dd1882022304 [root@bogon home]# docker exec -it th_centos_4 /bin/bash [root@d2e756a08a0b /]# ls /opt 1.flv 1080P_daxiongtu_30fps_2D_3600frames_an.flv 20180621_online_60min.flv ffmpeg-20180524.tar.gz out3.h264 testtf.flv 1.mp4 2.flv 20180627_cctv_5min.flv out.flv out_1080p.flv [root@d2e756a08a0b /]#
拷贝文件到宿主机的 /mtfs/media 目录下看看在容器中同样可以看到该文件;
6 查看容器的 IP 地址
我们可以通过以下命令查看容器运行的各种数据
docker inspect th_centos_4
通过上述命令可以查看 docker 容器中很多的的信息,其中就包含了 ip 地址;( mount 挂载信息也可以看到 )
[root@bogon ~]# docker inspect th_centos_4 ........... 略 ............. "Mounts": [ "Type": "bind", "Source": "/mtfs/media", "Destination": "/opt", "NetworkSettings": { "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.6", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:11:00:06",
我们也可以使用如下命令过滤 ip 地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' th_centos_4
[root@bogon ~]# docker inspect --format='{{.NetworkSettings.IPAddress}}' th_centos_4 172.17.0.6
7 删除容器
删除指定的容器(只能删除关闭的容器)
docker rm $CONTAINER_ID/NAME
[root@bogon ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d2e756a08a0b centos "/bin/bash" 11 minutes ago Up 11 minutes th_centos_4 690301d8ba86 centos "/bin/bash" 37 minutes ago Exited (0) 36 minutes ago th_centos_2 [root@bogon ~]# docker rm th_centos_2 th_centos_2 [root@bogon ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d2e756a08a0b centos "/bin/bash" 11 minutes ago Up 11 minutes th_centos_4
删除所有的容器 (其中 docker ps -a -q 为提取 docker 中所以的 容器的 id 号 )
docker rm `docker ps -a -q`
8 实时查看 docker 容器的日志
docker logs -f -t --tail 行数 容器名
例:实时查看docker容器名为 th_ubuntu 的最后10行日志
docker logs -f -t --tail 10 th_ubuntu
-
Docker容器的重启策略及docker run的--restart选项详解
2017-06-11 23:39:511. Docker容器的重启策略 Docker容器的重启策略是面向生产环境的一个启动策略,在开发过程中可以忽略该策略。 Docker容器的重启都是由Docker守护进程完成的,因此与守护进程息息相关。 Docker容器的重启策略如下...1. Docker容器的重启策略
Docker容器的重启策略是面向生产环境的一个启动策略,在开发过程中可以忽略该策略。
Docker容器的重启都是由Docker守护进程完成的,因此与守护进程息息相关。
Docker容器的重启策略如下:
- no,默认策略,在容器退出时不重启容器
- on-failure,在容器非正常退出时(退出状态非0),才会重启容器
- on-failure:3,在容器非正常退出时重启容器,最多重启3次
- always,在容器退出时总是重启容器
- unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
2. Docker容器的退出状态码
docker run的退出状态码如下:
- 0,表示正常退出
- 非0,表示异常退出(退出状态码采用chroot标准)
- 125,Docker守护进程本身的错误
- 126,容器启动后,要执行的默认命令无法调用
- 127,容器启动后,要执行的默认命令不存在
- 其他命令状态码,容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码
3. docker run的--restart选项
通过--restart选项,可以设置容器的重启策略,以决定在容器退出时Docker守护进程是否重启刚刚退出的容器。
--restart选项通常只用于detached模式的容器。
--restart选项不能与--rm选项同时使用。显然,--restart选项适用于detached模式的容器,而--rm选项适用于foreground模式的容器。
在docker ps查看容器时,对于使用了--restart选项的容器,其可能的状态只有Up或Restarting两种状态。
示例:
docker run -d --restart=always ba-208
docker run -d --restart=on-failure:10 ba-208
补充:
查看容器重启次数
docker inspect -f "{{ .RestartCount }}" ba-208
查看容器最后一次的启动时间
docker inspect -f "{{ .State.StartedAt }}" ba-208参考链接:
https://docs.docker.com/engine/reference/run/
-
docker 容器
2018-06-10 00:43:15什么是Docker?Docker是一个开源项目,诞生于2013年初,最初是dotCloud公司内部的一个业余项目。它基于Google公 司推出的Go语言实现。 项目后来加入了Linux基金会,遵从了Apache 2.0协议,项目代码在GitHub上进行 维护。...什么是Docker?
Docker是一个开源项目,诞生于2013年初,最初是dotCloud公司内部的一个业余项目。它基于Google公 司推出的Go语言实现。 项目后来加入了Linux基金会,遵从了Apache 2.0协议,项目代码在GitHub上进行 维护。 Docker自开源后受到广泛的关注和讨论,以至于dotCloud公司后来都改名为Docker Inc。Redhat已经在其 RHEL6.5中集中支持Docker;Google也在其PaaS产品中广泛应用。 Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。
Docker的基础是Linux的容器技术(LXC)。
我们知道,传统的虚拟机通过在宿主主机中运行hypervisor来模拟一整套完整的硬件环境提供给虚拟机的操 作系统。虚拟机系统看到的环境是可限制的,也是彼此隔离的。 这种直接的做法实现了对资源最完整的封 装,但很多时候往往意味着系统资源的浪费。 例如,以宿主机和虚拟机系统都为Linux系统为例,虚拟机中运 行的应用其实可以利用宿主机系统中的运行环境。 我们知道,在操作系统中,包括内核、文件系统、网络、PID、UID、IPC、内存、硬盘、CPU等等,所有的资 源都是应用进程直接共享的。 要想实现虚拟化,除了要实现对内存、CPU、网络IO、硬盘IO、存储空 间等的限制外,还要实现文件系统、网络、PID、UID、IPC等等的相互隔离。 前者相对容易实现一些,后 者则需要宿主机系统的深入支持。 随着Linux系统对于名字空间功能的完善实现,程序员已经可以实现上面的所有需求,让某些进程在彼此隔 离的名字空间中运行。大家虽然都共用一个内核和某些运行时环境(例如一些系统命令和系统库),但是 彼此却看不到,都以为系统中只有自己的存在。这种机制就是容器(Container),例如名字空间来做权限的 隔离控制,利用cgroups来做资源分配。而Docker,正是在容器的基础上进行了进一步的封装,让用户不需要 去关心容器的管理,使得操作更为简便。用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。 下面的图片比较了Docker和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接 复用本地主机的操作系统,而传统方式则是在硬件层面实现。
为什么要使用docker?
作为一种新兴的虚拟化方式,Docker跟传统的虚拟化方式相比具有众多的优势。 首先,Docker容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker对系统资源的利用率很高,一台主机上可以同时运行数千个Docker容器。 而且容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。
Docker可以实现快速的应用交付 对开发人员来说,最希望的就是一次创建,可以在任意地方执行。 对运维人员来说,最希望的就是一次配 置,可以在任意环境运行。 开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序 是如何创建和工作的。 Docker容器很轻!很快!容器的启动时间是次秒级的,大量地节约开发、测试、部署的时间。更容易的部署和扩展 对运维人员来说,最希望的就是一次配置,可以在任意环境运行。 Docker容器可以在几乎所有的环境中运行,物理机、虚拟机、公有云、私有云、个人电脑、服务器等等。 Docker容器兼容很多平台,这样就可以很容易地把一个应用程序从一个平台迁移到另外一个。虚拟化的层次决定了 效率 Docker容器的运行不需要额外的hypervisor支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。快速部 署也意味着 更简单的管理通常只需要小小的改变就可以替代以往巨型和大量的更新工作。所有的修改以增量的方式被分发和更 新,可以实现自动化并且高效的管理。
Docker包括三个基本概念
镜像(Image) 容器(Container) 仓库(Repository)
理解了这三个概念,就理解了Docker的整个生命周期。 镜像 docker 镜像就是一个只读的模板。 例如:一个镜像可以包含一个完整的ubuntu的操作系统,里面仅安装了Apache或者你需要的其它应用程 序。 镜像可以用来创建Docker容器。 Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,你甚至可以直接从其他人那里下载一个 已经做好的镜像来直接使用。 docker容器 Docker利用容器来运行应用。 容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全 的平台。可以把容器看做是一个应用程序。 *镜像是只读的,容器在启动的时候创建一层可写层作为最上层。 docker仓库 仓库是集中存放镜像文件的场所,分为公有仓库和私有仓库2种形式。 公有仓库,目前仅有Docker Hub,提供了一个数量庞大的镜像库供用户下载。当然,用户也可以在本地网 络内创建一个私有仓库。 当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下次在另外一台机 器上使用这个镜像时候,只需要从仓库上pull下来就可以了。 *Docker Hub的功能跟GitHub类似;push和pull操作跟git的操作类似。
安装部署
安装环境:redhat [root@foundation27~]yum install -y docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm #此版本过高,有太多依赖性,需要7.3的yum源 [root@foundation27 ~]# systemctl start docker #启动 [root@foundation27 ~]# docker version #查看docker版本 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 查看容器修改 docker run -d --name vm1 ubuntu bash -c "while true; do echo westos; sleep 1; done" 后台运行 docker stop vm1 停止容器 docker start vm1 启动容器 docker kill vm1 强制干掉容器 docker restart vm1 重启容器 docker pause/unpause vm1 暂停/恢复容器 docker rm vm1 删除容器 docker export vm1 > vm1.tar 导出容器 docker import vm1.tar image 导入容器为镜像 image 镜像管理 docker search 查询镜像 docker pull 拉取镜像 docker push 推送镜像 [root@foundation27 ~]# docker load -i game2048.tar #导入镜像 [root@foundation27 ~]# docker images game2048 #查看镜像
[root@foundation27 ~]# ip addr #查看docker ip
[root@foundation27 ~]# brctl show
[root@foundation27 ~]# docker run -d --name game game2048 #给容器命名并让其后台启动
[root@foundation27 ~]# docker inspect game #查看容器详细信息找出IP
[root@foundation27 ~]# docker stop game #停止容器
[root@foundation27 ~]# docker rm game #删除容器
[root@foundation27 ~]# docker run -d --name game -p 8080:80 game2048 #做端口映射,使访问物理机8080端口可以访问到
[root@foundation27 ~]# docker load -i ubuntu.tar
[root@foundation27 ~]# docker run --name vm1 -it ubuntu #创建容器 -it 获取交互式shell
此时,容器与物理机共享内核,将主机的文件挂载过来并加以修改
Ctrl+pq 退出交互式,并没有停止容器
[root@foundation27 ~]# docker ps -a #查看容器状态
容器端口映射:
[root@foundation27 ~]# docker run -d --name vm1 -p 8000:80 nginx # -p指定端口 -P 随机分配端口
[root@foundation27 docker]# vim test.html
[root@foundation27 docker]# docker container cp test.html vm1:/usr/share/nginx/html #设置发布页面数据卷管理
docker run 在创建容器时使用 -v 参数可以挂载一个或多个数据卷到当前运行的容器中,-v的作用是将宿主机上的目录作为容器的数据卷挂载到容器中,使宿主机和容器之间可以共享一个目录。挂载数据卷到新创建的容器上:
# docker run -it --name westos -v /tmp/data1:/data1 -v /tmp/data2:/data2 rhel7 /bin/bash
-v 参数可以重复使用,挂载多个数据卷到容器中,冒号前面的是宿主机的目录(本地目录
不存在 docker 会自动创建),冒号后面的是容器中的挂载目录。
注:docker commit 时卷的数据不会被保存。
默认挂载可以读写数据卷,也可以只读挂载:
# docker run -it --name westos2 -v /tmp/data2:/data2:ro
rhel /bin/bash
挂载宿主机文件:
[root@foundation27 docker]# docker run -d --name vm1 -v `pwd`/web:/usr/share/nginx/html -p 8000:80 nginx
[root@foundation27 docker]# docker run -it --name vm2 -v /etc/passwd:/passwd:ro ubuntu
[root@foundation27 docker]# docker run -it --name vm3 -v /tmp/docker/data1:/data1 -v /tmp/docker/data2:/data2:ro ubuntu
容器互联:
--link 参数可以在不映射端口的前提下为两个容器间建立安全连接, --link 参数可以连接一个或多个容器到将要创建的容器。
--link 参数的格式为 --link name:alias,其中 name 是要链接的容器的名称,alias 是这个连接的别名。
[root@foundation27 ~]# docker run -it --name vm1 ubuntu
[root@foundation27 ~]# docker run -it --name vm2 --link vm1:server1 ubuntu “:”前为要连接容器名,后面为给起的别名
网络管理
Docker 在启动时会创建一个虚拟网桥 docker0,默认地址为 172.17.0.1/16, 容器启动后都会被桥接到 docker0 上,并自动分配
到一个 IP 地址。
容器的四种网络模式:
bridge 桥接模式、host 模式、container 模式和 none 模式启动容器时可以使用 --net 参数指定,默认是桥接模式。
以下是 docker 网络初始化的过程:
Bridge 桥接模式的实现步骤主要如下: (1) Docker Daemon 利用 veth pair 技术,在宿主机上创建两个虚拟网络接口设备,假设为veth0 和 veth1。而 veth pair 技术的特性 可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。 (2) Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0; (3) Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。如此一来,保证宿主机的网络报文 若发往 veth0,则立即会被 eth0 接收,实现宿主机到Docker Container 网络的联通性;同时,也保证 Docker Container 单独使用 eth0, 实现容器网络环境的隔离性。
bridge 桥接模式下的 Docker Container 在使用时,并非为开发者包办了一切。最明显的是,该模式下 Docker Container 不具有一个公有 IP,即和宿主机的 eth0 不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信。虽然 NAT 模式经过中间处理实现了这一 点,但是 NAT 模式仍然存在问题与不便,如:容器均需要在宿主机上竞争端口,容器内部服务的访问者需要使用服务发现获知服务的外部端口等。另 外 NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。
Host 网络模式: host 模式是 bridge 桥接模式很好的补充。采用 host 模式的 Docker Container,可以直接使用宿主机的 IP 地址与外界进行通 信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换。当然,有这样的方便,肯定会损失部分其他的特性,最明显的是 Docker Container 网络环境隔离性的弱化,即容器不再拥有隔离、 独立的网络栈。另外,使用 host 模式的 Docker Container 虽然可以让容器内部的服务和传统情况无差别、无改造的使用,但是由于网 络隔离性的弱化,该容器会与宿主机共享竞争网络栈的使用;另外,容器内部将不再拥有所有的端口资源,原因是部分端口资源已经被宿主机本 身的服务占用,还有部分端口已经用以 bridge 网络模式容器的端口映射。
Vm2使用和主机一样的网络
Container 网络模式: (1) 查找 other container(即需要被共享网络环境的容器)的网络 namespace; (2) 将新创建的 Docker Container(也是需要共享其他网络的容器)的 namespace,使用 other container 的 namespace。Docker Container 的 other container 网络模式,可以用来更好的服务于容器间的通信。 在这种模式下的 Docker Container 可以通过 localhost 来访问 namespace 下的其他容器,传输效率较高。虽然多个容器共享 网络环境,但是多个容器形成的整体依然与宿主机以及其他容器形成网络隔离。另外,这种模式还节约了一定数量的网络资源。但是需要 注意的是,它并没有改善容器与宿主机以外世界通信的情况。
Vm3使用和vm1一样的ip
None 网络模式: 网络环境为 none,即不为 Docker Container 任何的网络环境。一旦 Docker Container 采用了none 网络模式,那么容器内部 就只能使用 loopback 网络设备,不会再有其他的网络资源。可以说 none 模式为 Docker Container 做了极少的网络设定,但是 俗话说得好“少即是多”,在没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制开发。这也恰巧 体现了 Docker 设计理念的开放。 在 none 网络模式下分配固定 ip:netns 是在 linux 中提供网络虚拟化的一个项目,使用 netns 网络空间虚拟化可以在本地虚拟 化出多个网络环境,目前 netns 在 lxc 容器中被用来为容器提供网络。使用 netns 创建的网络空间独立于当前系统的网络空间,其 中的网络设备以及 iptables 规则等都是独立的,就好像进入了另外一个网络一样。
[root@foundation27 ~]# docker run -it --name vm4 --net none ubuntu
[root@foundation27 ~]# ip link add name veth0 type veth peer name veth1
[root@foundation27 ~]# brctl addif docker0 veth0
[root@foundation27 ~]# mkdir /var/run/netns
[root@foundation27 ~]# docker inspect vm4 | grep Pid #查看vm4的Pid
[root@foundation27 ~]# cd /var/run/netns/
[root@foundation27 netns]# ln -s /proc/4396/ns/net 4396
[root@foundation27 netns]# ip addr
[root@foundation27 netns]# ip link set veth1 netns 4396
[root@foundation27 netns]# docker attach vm4
[root@foundation27 netns]# ip netns exec 4396 ip link set veth1 name eth0
[root@foundation27 netns]# ip netns exec 4396 ip link set eth0 up
[root@foundation27 netns]# ip netns exec 4396 ip addr add 172.17.0.100/24 dev eth0
[root@foundation27 netns]# ip netns exec 4396 ip route add default via 172.17.0.1
[root@foundation27 netns]# docker attach vm4
常用的 namespace 的命令: 1. 添加一个 namespace ip netns add [name] 2. 在 namespace 中启用一个设备 ip netns exec [name] ip link set lo up 3. 在 namespace 中新加一个设备 ip link set [dev-name] netns [name] 启用: ip netns exec [name] ip link set [dev-name] up 4. 查看指定 namespace 中指定设备的参数信息 ip netns exec [name] ip addr show [dev-name] permanent scope global 5. 为 namespace 中指定设备设置 ip ip netns exec [name] ip -4 addr add 192.168.1.2/24 brd 192.168.1.255 scope global dev [dev-name] 6.查看所有 network namespace ip netns list 7.ping 虚拟机实例 ip netns exec [name] ping 192.168.1.3
Docke 安全
[root@foundation27 docker]# docker run --name vm0 -it ubuntu
[root@foundation27 docker]# docker run --name vm1 -it --privileged=true ubuntu
Dockfile 安装部署服务
Dockerfiel安装apache [root@foundation27 docker]# vim Dockerfile #编写配置文件 FROM rhel7 MAINTAINER yakexi007@westos.org ENV HOSTNAME server1 EXPOSE 80 COPY dvd.repo /etc/yum.repos.d/dvd.repo RUN rpmdb --rebuilddb &&yum install -y httpd CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"] [root@foundation27 docker]# docker build -t rhel7:apache . #编译镜像
[root@foundation27 docker]# docker history rhel7:apache[root@foundation27 docker]# docker run -d -p 8000:80 --name web -v `pwd`/web:/var/www/html rhel7:apache
Dockerfile部署ssh
[root@foundation27 docker]# cat Dockerfile FROM rhel7 MAINTAINER yakexi007@westos.org ENV HOSTNAME server2 EXPOSE 22 COPY dvd.repo /etc/yum.repos.d/dvd.repo RUN rpmdb --rebuilddb &&yum install -y openssh-server openssh-clients && ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -q -N "" && ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -q -N "" && ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -q -N "" && echo root:westos | chpasswd CMD ["/usr/sbin/sshd", "-D"] [root@foundation27 docker]# docker build -t rhel7:ssh . [root@foundation27 docker]# docker run -d --name ssh -p 2222:22 rhel7:ssh
[root@foundation27 ~]# ssh -p 2222 root@172.25.254.27
[root@foundation27 docker]# docker inspect ssh #查看容器详情ip
Dockerfile部署多个服务
[root@foundation27 docker]# vim dvd.repo [root@foundation27 docker]# cat dvd.repo [dvd] name=rhel7.3 baseurl=http://172.25.27.250/rhel7.3 gpgcheck=0 [supervisor] name=supervisor baseurl=http://172.25.27.250/pub/docker gpgcheck=0 [root@foundation27 docker]# vim Dockerfile [root@foundation27 docker]# cat Dockerfile FROM rhel7 MAINTAINER yakexi007@westos.org ENV HOSTNAME server3 EXPOSE 22 80 COPY dvd.repo /etc/yum.repos.d/dvd.repo RUN rpmdb --rebuilddb &&yum install -y httpd openssh-server openssh-clients supervisor && ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -q -N "" && ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -q -N "" && ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -q -N "" && echo root:westos | chpasswd COPY supervisord.conf /etc/supervisord.conf CMD ["/usr/bin/supervisord"] [root@foundation27 docker]# vim supervisord.conf [supervisord] nodaemon=true [program:httpd] command=/usr/sbin/httpd -DFOREGROUND [program:sshd] command=/usr/sbin/sshd -D [root@foundation27 docker]# docker build -t rhel7:super . [root@foundation27 docker]# docker run -d --name super -p 2222:22 -p 8000:80 rhel7:super
Docker -compose
[root@foundation27 桌面]# mv docker-compose-Linux-x86_64 docker-compose #重命名二进制命令
[root@foundation27 桌面]# mv docker-compose /bin/ #移动到/bin/下
[root@foundation27 桌面]# cd /bin/
[root@foundation27 bin]# chmod +x docker-compose
[root@foundation27 bin]# which docker-compose
[root@foundation27 bin]# cd /tmp/docker/
[root@foundation27 docker]# mkdir compose/
[root@foundation27 compose]# docker images
[root@foundation27 compose]# vim docker-compose.yml web1: image: rhel7:apache volumes: - "./web1:/var/www/html/" expose: - 80 web2: image: nginx volumes: - "./web2:/usr/share/nginx/html/" expose: - 80 haproxy: image: haproxy volumes: - ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg links: - web1 - web2 ports: - "8080:80" expose: - 80
[root@foundation27 compose]# mkdir haproxy [root@foundation27 compose]# vim haproxy/haproxy.cfg global log 127.0.0.1 local0 log 127.0.0.1 local1 notice defaults log global mode http option httplog option dontlognull timeout connect 5000ms timeout client 50000ms timeout server 50000ms stats uri /status frontend balancer bind 0.0.0.0:80 mode http default_backend web_backends backend web_backends balance roundrobin server apache web1:80 check server nginx web2:80 check
[root@foundation27 compose]# mkdir web1
[root@foundation27 compose]# mkdir web2
[root@foundation27 compose]# cat web1/index.html
<h1>apache</h1>
[root@foundation27 compose]# cat web2/index.html
<h1>nginx</h1>
[root@foundation27 compose]# docker-compose up
[root@foundation27 ~]# docker ps
测试:
Docker swarm
Server21 22 23先安装docker并启动
[root@server21 ~]# docker swarm init #设置swarm 集群的控制节点
[root@server22 ~]# systemctl start docker
# 在server22 server23上按照提示执行复制srever21内容,使其加入集群
[root@server22 ~]# docker swarm join \
> --token SWMTKN-1-647rxivlg8buev7xq07rupsd4t4chqmrg8qyh6pb8u0x4mw4h9-865466niii48b52d449k1s9tm \
> 172.25.27.21:2377
This node joined a swarm as a worker.
[root@server21 ~]# docker node ls #查看节点
[root@server21 ~]# docker load -i nginx.tar #3台节点都做
[root@server21 ~]# yum install bash -* #是tab 键可以自动补齐命令,装好后必须断开ssh,重新ssh 连接才能使其生效
[root@server21 ~]# docker service create --name web --replicas 3 -p 80:80 nginx #创建容器并命名
[root@server21 ~]# docker service ps web #查看web状态
[root@server21 ~]# yum install -y net-tools
[root@server21 ~]# docker ps #查看web 的信息,复制其id
[root@server21 ~]# vim index.html #编写nginx发布页面
[root@server21 ~]# docker container cp index.html 79d9093ece1d:/usr/share/nginx/html #server22,23 做同样操作
测试:
可以看出此时swarm集群中每个节点都起了以wed服务,并以负载均衡方式提供服务
[root@server23 ~]# systemctl stop docker.service #停止server23上的docker服务
发现,当swarm集群其中一个节点宕掉后,其会自动退出机集群,剩下的节点继续负载均衡
[root@server21 ~]# docker service scale web=6 #设置服务数量
添加图形界面
[root@server21 ~]# docker load -i visualizer.tar #三个节点都导入,否则会监控不到
[root@server21 ~]# docker service create \
> --name=viz \
> --publish=8000:8080/tcp \
> --constraint=node.role==manager \
> --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
> dockersamples/visualizer
灰度更新
[root@foundation27 ~]# docker save rhel7:apache > rhel7.tar #导出镜像,即制作要更新的镜像
[root@server21 mnt]# docker load -i rhel7.tar #21,22,23都导入
[root@server21 mnt]# docker service update --image rhel7:apache --update-delay 5s --update-parallelism 3 web #每5秒更新一次,每次更新3个
-
docker容器中,主机可以ping通虚拟机,但是ping不通docker容器
2019-01-07 20:29:56最近研究docker容器发现几个问题有几点疑惑: 1.首先自己的ISO文件打成tar包后导如容器中,防火墙fiter、nat表丢失,启动也启动不了,百度能查到的基本都试了,貌似没什么用,而且虚拟机还ping不通docker地址; 2.... -
Docker容器
2014-11-12 17:07:25前面我们讲了Docker三个主要概念中的镜像, -
Docker容器命令
2019-06-12 11:48:05Docker容器命令 文章目录Docker容器命令1. docker运行(创建)容器命令2. docker查看容器命令3. docker退出容器命令4. docker启动容器命令5. docker重启容器命令6. docker停止容器命令7. docker删除容器命令8. docker... -
docker 容器无root 权限,如何获得docker容器里面的root权限
2018-11-10 20:26:49首先你的container得正在运行。 可通过sudo docker container ls查看容器的CONTAINER ID 最后执行命令(其中848669a8722b为上面查到的CONTAINER ID) sudo docker exec -ti -u...如何获得docker容器里面的root权限 ... -
Docker 容器技术
2020-09-20 12:51:28Docker容器技术 概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会... -
docker容器的网络配置,允许docker可以被宿主机以外的其它主机访问以及局域网内可以直接访问docker容器ip
2018-09-28 14:11:27自从Docker容器出现以来,容器的网络通信就一直是被关注的焦点,也是生产环境的迫切需求。容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信。 一、端口映射(局域网,外网此... -
Docker容器技术与应用(项目1 Docker容器简介)
2018-05-26 14:41:55项目1Docker容器简介任务1.1 了解Docker历史1.1.1 什么是 DockerDocker 最初是dotCloud 公司创始人 Solomon Hykes在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于2013 年 ... -
Docker 容器shell
2019-07-04 10:41:04版权所有,未经许可,禁止转载 章节Docker 介绍 ...Docker 容器(container) Docker 容器操作 Docker 容器shell Docker Dockerfile Docker 构建镜像(docker build) Docker Dockerfile指令 Docker ... -
分布式进阶(九)Ubuntu下使用nsenter进入Docker容器
2015-05-25 09:18:39使用nsenter进入Docker容器 Docker容器运行后,如何进入容器进行操作呢?起初我是用SSH。如果只启动一个容器,用SSH还能应付,只需要将容器的22端口映射到本机的一个端口即可。当我启动了五个容器后,每个容器默认是... -
docker容器中tomcat操作和部署Java应用(Docker容器挂载宿主机文件)
2019-03-07 11:49:21docker容器中tomcat操作和部署Java应用(Docker容器挂载宿主机文件) 一、Docker安装 参考:https://blog.csdn.net/muriyue6/article/details/82865201 二、拉取tomcat镜像 1.搜索tomcat镜像信息 [root@localhost ... -
分布式进阶(七)Ubuntu下如何进入 Docker 容器
2015-05-25 09:13:46如何进入Docker容器 英文原文:HowtoenteraDockercontainer 在这篇文章里,我将讨论四种连接Docker容器并与其进行交互的方法。例子中所有的代码都可以在GitHub中找到,你可以亲自对它们进行测试。 nsenter 从util-... -
Docker容器日志查看与清理(亲测有效)
2018-05-11 16:47:43docker容器日志导致主机磁盘空间满了。 2. 解决方法 2.1 找出Docker容器日志 容器日志一般存放在/var/lib/docker下面,查看各个日志的文件大小 # ls -lh $(find /var/lib/docker/containers/ -name *... -
一个docker容器中运行多个服务还是弄一堆docker容器运行?
2019-01-08 15:21:14不建议直接在单个 Docker 容器中运行多个程序。以 2017年 10 月18 日 Docker 官方支持 Kubernetes 为分水岭计算,Kubernetes 赢得容器编排之战的最终胜利已经超过一年。先来看一下经典的 Kubernetes 架构图:可以... -
解决docker容器中文乱码,修改docker容器编码格式
2017-10-17 08:20:01原文地址:http://blog.csdn.net/u011077672/article/details/70569849,经过验证,该方法能共解决docker容器乱码的问题。测试时使用的环境是ubuntu12.04。 前台上传文件到服务器后,服务器返回给前台的文件列表中... -
Docker 容器健康检查
2021-01-21 11:20:33Docker 容器健康检查指的是在 Dockerfile 中使用 HEALTHCHECK 指令对容器的运行状态进行检查, 并在 docker ps 的 STATUS 栏显示 healthy/unhealthy。 HEALTHCHECK 指令有两种格式: HEALTHCHECK [OPTIONS] CMD ... -
docker 进入容器和docker容器与宿主拷贝文件
2020-03-21 01:42:05进入docker 容器拷贝文件到宿主机上 docker cp onlyoffice-community-server:/etc/nginx/nginx.conf /home/ 其中onlyoffice-community-server 是容器名称,/etc/nginx/nginx.conf 为docker的路径 /home为宿主机... -
进入docker容器的四种方法
2018-05-07 18:58:30在使用Docker创建了容器之后,大家比较关心的就是如何进入该容器了,其实进入Docker容器有好几多种方式,这里我们就讲一下常用的几种进入Docker容器的方法。进入Docker容器比较常见的几种做法如下:使用docker ... -
Docker容器的重启策略
2019-05-26 14:45:341. Docker容器的重启策略 Docker容器的重启策略是面向生产环境的一个启动策略,在开发过程中可以忽略该策略。 Docker容器的重启都是由Docker守护进程完成的,因此与守护进程息息相关。 Docker容器的重启策略如下: ... -
Docker整理之Docker容器连接(link)与Docker容器数据管理(volumn)(四)
2016-10-19 14:27:47Docker容器连接 端口映射并不是唯一把docker连接到另一个容器的方法。docker有一个连接系统允许将多个容器连接在一起,共享连接信息。docker连接会创建一个父子关系,其中父容器可以看到子容器的信息。 容器命名 ... -
Docker 容器安装 Mysql 详解
2018-08-18 09:00:56目录 环境说明 Mysql 镜像检索 Mysql 镜像下载 Mysql 容器运行 ...《Docker 镜像操作 常用命令》中说明了如何从 Docker Hub 上下载镜像,《Docker 容器操作 常用命令》中说明了如何启动容器 本文将以... -
Docker 容器化技术介绍(二) 之 Docker 简介
2018-08-24 19:43:44Docker 容器化技术介绍(一) 之 虚拟化技术 Docker 容器化技术介绍(二) 之 Docker 简介 Docker 容器化技术介绍(三) 之 Docker 组件 Docker 容器化技术介绍(四) 之 Docker的安装与启动 Docker 容器化技术... -
Docker 容器数据卷
2020-02-12 17:47:35容器数据卷是什么 ...Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。 为了能保存数据在docker中我们使用卷。 ... -
实时查看docker容器日志
2017-10-26 17:39:08实时查看docker容器日志 $ sudo docker logs -f -t --tail 行数 容器名 例:实时查看docker容器名为s12的最后10行日志 $ sudo docker logs -f -t --tail 10 s12 -
Docker容器日志清理
2017-06-09 15:33:06docker容器导致主机磁盘空间满了 如何清理Docker容器日志? 如何找出docker容器日志文件 容器日志一般存放在/var/lib/docker下面,可使用如下命令查看各个日志的文件大小 ls -lh $(find /var/lib/docker/...