目录
一、Docker概述
1.1 Docker介绍
1.2 Docker的优势
1.3 Docker的核心概念
二、Docker安装
2.1 Docker版本与官方安装方式
2.2 国内源安装新版
三、Docker镜像与容器管理
3.1 Docker镜像与容器区别
3.2 Docker镜像管理
3.3 Docker容器管理
四、Docker容器与宿主机之间拷贝
五、Docker容器镜像打包迁移
5.1容器打包 export
5.2通过容器创建镜像 commit
5.3镜像打包迁移
六、通过dockerfile创建镜像
七、Docker容器应用
7.1部署centos7容器应用
7.2部署docker web ui应用
八、Docker端口转发
九、Docker容器卷管理
十、Docker网络管理
一、Docker概述
1.1 Docker介绍
Docker是Docker.Inc公司开源的一个基于轻量级虚拟化技术的容器引擎项目,整个项目基于Go语言开发,并遵从Apache 2.0协议。通过分层镜像标准化和内核虚拟化技术,Docker使得应用开发者和运维工程师可以以统一的方式跨平台发布应用,并且以几乎没有额外开销的情况下提供资源隔离的应用运行环境。
Docker是一个开源工具,它可以让创建和管理 docker容器变得简单。容器就像是轻量级的虚拟机,并且可以以秒级的速度来启动或停止。
1.轻量级
2.占用资源少(内存、CPU)
3.对基础环境几乎没有依赖性
Docker容器与VM的区别 :
表面区别:
容器占用体积小,虚拟机占用体积大
隔离性:容器提供了基于进程的隔离,而虚拟机提供了资源的完全隔离。
启动速度:虚拟机可能需要一分钟来启动,而容器只需要一秒钟或更短。
容器使用宿主操作系统的内核,而虚拟机使用独立的内核。Docker 的局限性之一是,它只能用在64位的操作系统上。
本质区别:
容器是被隔离的进程
1.2 Docker优势
(1)交付物标准化
Docker的标准化交付物称为"镜像",它包含了应用程序及其所依赖的运行环境,大大简化了应用交付的模式。
(2)应用隔离
Docker可以隔离不同应用程序之间的相互影响,比虚拟机开销更小。总之,容器技术部署速度快,开发、测试更敏捷;提高系统利用率,降低资源成本.
(3)一次构建,多次交付
类似于集装箱的"一次装箱,多次运输",Docker镜像可以做到"一次构建,多次交付"。
(4)Docker的度量:
Docker是利用容器来实现的一种轻量级的虚拟技术,从而在保证隔离性的同时达到节省资源的目的。Docker的可移植性可以让它一次建立,到处运行。
Docker的度量可以从以下四个方面进行:
1)隔离性
通过内核的命名空间来实现的,将容器的进程、网络、消息、文件系统和主机名进行隔离。
2)可度量性
Docker主要通过cgroups控制组来控制资源的度量和分配。
3)可移植性
Docker利用AUFS来实现对容器的快速更新,AUFS是一种支持将不同目录挂载到同一个虚拟文件系统下的文件系统,支持对每个目录的读写权限管理。AUFS具有层的概念,每一次修改都是在已有的只写层进行增量修改,修改的内容将形成新的文件层,不影响原有的层。
4)安全性
安全性可以分为容器内部之间的安全性;容器与托管主机之间的安全性。容器内部之间的安全性主要是通过命名空间和cgroups来保证的。容器与托管主机之间的安全性主要是通过内核能力机制的控制,可以防止Docker非法入侵托管主机。
1.3 Docker核心概念
概念 | 定义 | 特性 | 关系 | 示例 |
---|---|---|---|---|
镜像 | 轻量级、不可变的二进制包,包含运行应用所需的文件和依赖。 | 不可变、分层存储、便携性、可版本控制。 | 创建容器的基础,存储在仓库中。 | docker pull,docker build |
容器 | 镜像的运行实例,提供隔离的操作环境。 | 轻量级、可移植、隔离性、短暂性。 | 从镜像创建并运行,使用仓库中的镜像。 | docker run,docker stop |
仓库 | 存储和分发 Docker 镜像的地方。 | 镜像存储、共享、权限控制。 | 存储镜像,供创建容器使用。 | docker push,docker pull |
(1)Docker仓库
用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供用户使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。
仓库(registry) -->Repository-->镜像:v1.1(按版本区分)
docker.io/centos:7
registry/repository:tagrepository:存储库
docker 国内仓库
aliyun
daocloud
(2)Docker镜像
Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。Docker 使用 UnionFS 来将这些层联合到单独的镜像中。正因为有了这些层的存在,Docker 是如此的轻量。当你改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新的层被添加或升级了。
镜像由三部分组成:
镜像名称:仓库名称+镜像分类+tag名称(镜像版本)1.存储对象:images
2.格式:库名/分类:tag
3.tag:表示镜像版本
(3)Docker容器
名称空间 namespace 容器隔离(pid,net,mnt,user,hostname...)
资源限制 cgroups 资源(内存,cpu)
文件系统 overlay2(UnionFS)
二、Docker安装
2.1 Docker版本与官方安装方式
(1)Docker版本介绍
mby、docker-ce与docker-ee最早时docker是一个开源项目,主要由docker公司维护。2017年3月1日起,docker公司将原先的docker项目改名为moby,并创建了docker-ce和docker-ee。三者关系:moby project由社区维护,docker-ce project是docker公司维护,docker-ee是闭源的docker公司维护。
moby是继承了原先的docker的项目,是社区维护的的开源项目,谁都可以在moby的基础打造自己的容器产品
docker-ce是docker公司维护的开源项目,是一个基于moby项目的免费的容器产品
docker-ee是docker公司维护的闭源产品,是docker公司的商业产品
(2) 官方安装方式
Docker官网:https://www.docker.com/
如果是centos,上面的安装命令会在系统上添加yum源:/etc/yum.repos.d/docker-ce.repo
# wget https://download.docker.com/linux/centos/docker-ce.repo
# mv docker-ce.repo /etc/yum.repos.d
# yum install -y docker-ce
rpm包安装方式:
# wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm
# yum localinstall docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm
2.2 国内源安装新版
使用aliyun docker yum源安装新版docker
删除已安装的Docker
[root@docker-server ~]# yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
配置阿里云Docker Yum源
阿里云镜像源地址:mirrors.aliyun.com
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
# 将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
三、Docker镜像与容器管理
3.1 Docker镜像与容器区别
(1)Docker镜像
一个Docker镜像可以构建于另一个Docker镜像之上,这种层叠关系可以是多层的。第1层的镜像层我们称之为基础镜像(Base Image),其他层的镜像(除了最顶层)我们称之为父层镜像(Parent Image)。这些镜像继承了他们的父层镜像的所有属性和设置。
Docker镜像通过镜像ID进行识别。镜像ID是一个64字符的十六进制的字符串。但是当我们运行镜像时,通常我们不会使用镜像ID来引用镜像,而是使用镜像名来引用。
要列出本地所有有效的镜像,可以使用命令
# docker images
# docker image list
镜像可以发布为不同的版本,这种机制我们称之为标签(Tag),可以使用pull命令加上指定的标签:
# docker pull ubuntu:11
# docker pull ubuntu:12.04
# docker pull centos:7
(2)Docker容器
Docker容器可以使用命令创建:
# docker run -it imagename /bin/bash
当我们有一个正在运行的Docker容器时,从运行态到停止态,我们对它所做的一切变更都会永久地写到容器的文件系统中。要切记,对容器的变更是写入到容器的文件系统的,而不是写入到Docker镜像中的。我们可以用同一个镜像启动多个Docker容器,这些容器启动后都是活动的,彼此还是相互隔离的。我们对其中一个容器所做的变更只会局限于那个容器本身。如果对容器的底层镜像进行修改,那么当前正在运行的容器是不受影响的,不会发生自动更新现象。
3.2 Docker镜像管理
(1)搜索镜像
搜索基于centos操作系统的镜像(这种方法只能用于官方镜像库)
[root@docker-server ~]# docker search centos
(2)按星级搜索镜像
查找 star 数至少为 100 的镜像,默认不加 s 选项找出所有相关 centos 镜像:
[root@docker-server ~]# docker search ubuntu -f stars=100
(3)拉取镜像
没有加registry,默认是从docker.io/dockerhub下载的
[root@docker-server ~]# docker pull centos
[root@docker-server ~]# docker pull daocloud.io/library/tomcat:7
[root@docker-server ~]# docker pull daocloud.io/library/centos:7
(4)查看本地镜像
[root@docker-server ~]# docker image list
[root@docker-server ~]# docker images
(5)查看镜像详情
[root@docker-server ~]# docker inspect 镜像id/镜像名称
(6)删除镜像
删除一个或多个,多个之间用空格隔开,可以使用镜像名称或id
[root@docker-server ~]# docker rmi daocloud.io/library/mysql
[root@docker-server ~]# docker rmi 81debc
参数解释:
rm Remove one or more containers ---移除一个或多个容器
rmi Remove one or more images ---删除一个或多个镜像
(7)查看镜像id
[root@docker-server ~]# docker images -q
(8)删除所有镜像
[root@docker-server ~]# docker rmi `docker images -q`
(10)查看镜像制作过程
[root@docker-server ~]# docker history daocloud.io/library/nginx 使用镜像名或者镜像ID都可以
3.3 Docker容器管理
(1)创建新容器但不启动
[root@docker-server ~]# docker create -it daocloud.io/library/centos:7 /bin/bash
(2)创建并运行一个新Docker 容器:
同一个镜像可以启动多个容器,每次执行run子命令都会运行一个全新的容器
[root@docker-server ~]# docker run -it --restart=always daocloud.io/library/centos:7 /bin/bash #最常用
-i:标准输入输出
-t:分配一个终端或控制台
--restart=always:容器随docker engine自启动,因为在重启docker的时候默认容器都会被关闭,也适用于create选项
-d:后台运行容器,并返回容器ID
--rm:默认情况下,每个容器在退出时,它的文件系统也会保存下来.另一方面,也可以保存容器所产生的数据。但是当你仅仅需要短暂的运行一个容器,并且这些数据不需要保存,你可能就希望Docker能在容器结束时自动清理其所产生的数据。这个时候就需要--rm参数了。
示例:
[root@docker-server ~]# docker run -it --rm daocloud.io/library/nginx:latest /bin/bash
root@be2d0a462ce1:/# exit
exit
注意:不能用-d,--rm和--restart=alwarys冲突;
[root@docker-server ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
(3)自定义容器名称
为容器分配一个名字,如果没有指定,docker会自动分配一个随机名称是 docker run 子命令的参数--name= Assign a name to the container
# docker run -it --name 名字 daocloud.io/centos:6 /bin/bash #名字自定义
(4)断开关闭容器
若要断开与容器的连接,并且关闭容器:容器内部执行如下命令
root@37b8b8cdd75f:/# exit
如果只想断开和容器的连接而不关闭容器:
快捷键:ctrl+p+q
(5)查看容器
1.只查看运行状态的容器:
# docker ps
2.-a 查看所有容器
# docker ps -a
3.只查看所有容器id:
# docker ps -a -q
(6)查看容器详细信息
inspect :用于查看容器的配置信息,包含容器名、环境变量、运行命令、主机配置、网络配置和数据卷配置等。
目标:查找某一个运行中容器的id,然后使用docker inspect命令查看容器的信息。
提示:可以使用容器id的前面部分,不需要完整的id。
[root@docker-server ~]# docker inspect 容器名称/容器ID #机器上运行的一个容器ID或者名称
[root@docker-server ~]# docker inspect nginx2
(7)启动容器:
# docker start name #容器ID也可以
这里的名字是状态里面NAMES列列出的名字,这种方式同样会让容器运行在后台
(8)关闭容器:
# docker stop name
# docker kill name --强制终止容器
(9)杀死所有running状态的容器
# docker kill $(docker ps -q)
# docker stop `docker ps -q`
(10)删除容器:
# docker rm 容器id或名称
要删除一个运行中的容器,添加 -f 参数 --慎用。先stop在删除
(11)根据格式删除所有容器:
# docker rm $(docker ps -qf status=exited)
-f:过滤
pause :暂停容器中所有的进程
unpause:恢复容器内暂停的进程,与pause对应
(12)重启容器:
# docker restart name
(13)让容器运行在后台:
# docker run -dit 镜像ID /bin/bash
-d 后台运行必须要加-it
(14)rename ---修改容器名称
# docker rename nginx1 nginx-1
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c361ddb072a9 nginx:latest "/bin/bash" 3 minutes ago Up 3 minutes 80/tcp nginx-1
91dc346fa138 nginx:latest "/bin/bash" 6 minutes ago Up 6 minutes 80/tcp nginx2
(15)显示容器资源使用统计信息的实时流
[root@docker-server ~]# docker stats
--当有容器在运行的时候动态显示容器的资源消耗情况,包括:CPU、内存、网络I/O
(16)连接容器:前提是容器在运行状态中
# docker attach 容器id #前提是容器创建时必须指定了交互shell
[root@docker-server ~]# docker attach nginx-1
[root@docker-server ~]# docker exec -it 容器id /bin/bash
[root@docker-server ~]# docker exec -it nginx-1 /bin/bash
[root@docker-server ~]# docker exec 容器id touch /testfile
(17)监控容器的运行:
可以使用logs、top、wait这些子命令
logs:使用logs命令查看守护式容器,可以通过使用docker logs命令来查看容器的运行日志,其中--tail选项可以指定查看最后几条日志,使用-f选项可以跟踪日志的输出,直到手动停止。
[root@docker-server ~]# docker top nginx #容器ID也可以
[root@docker-server ~]# docker logs -f test1
[root@docker-server ~]# docker stop nginx1
=============================================================================
[root@docker-server ~]# docker wait nginx1 #第二个终端操作
四、Docker容器与宿主机之间拷贝
语法
docker cp [OPTIONS] CONTAINER:PATH LOCALPATH --从容器拷贝到本机
docker cp [OPTIONS] LOCALPATH CONTAINER:PATH --从本机拷贝到容器
如:容器nginx中/usr/local/bin/存在test.sh文件,可如下方式copy到宿主机
[root@docker-server ~]# docker run -it --name test nginx:latest /bin/bash
root@2a9a18b4a485:/# cd /usr/local/bin/
root@2a9a18b4a485:/usr/local/bin# touch test.txt
ctrl+p+q 退出
[root@docker-server ~]# docker cp test:/usr/local/bin/test.sh /root/
修改完毕后,将该文件重新copy回容器
[root@docker-server ~]# ls
anaconda-ks.cfg test.txt
[root@docker-server ~]# echo "123" >> test.txt
[root@docker-server ~]# docker cp /root/test.txt test:/
[root@docker-server ~]# docker cp -a /opt test:/usr/local/bin/ #拷贝目录
五、Docker容器镜像打包迁移
容器镜像打包迁移三种方式
把容器导出成tar包 export import
把容器做成镜像 commit -a "" -m ""
把镜像保存为tar包 save load
5.1容器打包 export
将容器的文件系统打包成tar文件,也就是把正在运行的容器直接导出为tar包的镜像文件
[root@docker-server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
daocloud.io/library/tomcat 7 50fcd208bfce 3 years ago 533MB
centos 7 b5b4d78bc90c 4 years ago 203MB
nginx latest 3f8a4339aadd 6 years ago 108MB
[root@docker-server ~]# docker run -it --name centos centos:7 /bin/bash
[root@docker-server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2e7006b30ea5 centos:7 "/bin/bash" 29 seconds ago Up 28 seconds centos
7be6833fc245 nginx:latest "/bin/bash" 3 hours ago Up 3 hours 80/tcp test1
91dc346fa138 nginx:latest "/bin/bash" 3 hours ago Up 3 hours 80/tcp nginx2[root@docker-server ~]# docker exec -it centos /bin/bash
[root@96e2b7265d93 /]# vi a.txt #编辑一个文件
hello
[root@96e2b7265d93 /]# yum install -y vim wget #安装一个软件
第一种
[root@docker-server ~]# docker export -o centos7-1.tar 96e2b726
[root@docker-server ~]# docker export -o centos7-1.tar centos
-o, --output
第二种
[root@docker-server ~]# docker export 容器名称 > 镜像.tar
[root@docker-server ~]# docker export centos > centos7-2.tar
打包后迁移镜像到宿主机:import
[root@docker-server ~]# docker import centos7-1.tar centos7-1:v1
[root@docker-server ~]# docker images
[root@docker-server ~]# docker run -it --name centos7-1 centos7-1:v1.0 /bin/bash
[root@c00ea9027989 /]# ls
a.txt anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@c00ea9027989 /]# cat a.txt
hello
5.2通过容器创建镜像 commit
背景:容器运行起来后,又在里面做了一些操作,并且要把操作结果保存到镜像里
方案:使用 docker commit 指令,把一个正在运行的容器,直接提交为一个镜像。
在容器内部新建了一个文件
[root@docker-server ~]# docker run -it --name centos7-2 centos7-1:v1.0 /bin/bash
[root@f0c009c4ed56 /]# touch test.txt
[root@f0c009c4ed56 /]# ls
将这个新建的容器提交到镜像中保存
[root@docker-server ~]# docker commit centos7-2 centos7/test:v2.0
[root@docker-server ~]# docker images
5.3镜像打包迁移
(1)save
保存一台宿主机上的镜像为tar文件,然后可以迁移到其他的宿主机上:将镜像打包,与下面的load命令相对应
[root@docker-server ~]# docker save -o nginx.tar nginx:latest
(2)load
与上面的save命令相对应,将上面sava命令打包的镜像通过load命令导入,(实验环境中原来机器上面有镜像可以先删除掉。)
[root@docker-server ~]# docker load < nginx.tar
[root@docker-server ~]# docker images
六、通过dockerfile创建镜像
Docker 提供了一种更便捷的方式,叫作 Dockerfile,docker build命令用于根据给定的Dockerfile构建Docker镜像
docker build语法:
# docker build [OPTIONS] <PATH | URL | ->
(1)创建镜像所在的文件夹和Dockerfile文件
[root@docker-server ~]# mkdir dockerfile
(2)在Dockerfile文件中写入镜像指令
每一条指令都会更新镜像的信息
[root@docker-server sinatra]# vim Dockerfile
#This is a comment
FROM centos7-1:v1.0 #基于哪个基础镜像
MAINTAINER soso soso@docker-server #指定作者
RUN touch a.txt
RUN mkdir /test
RUN yum -y install vim
(3)创建镜像
命令:
# docker build -t soso/centos:7 .
docker build 是docker创建镜像的命令
(4)创建完成后,从镜像创建容器
七、Docker容器应用
7.1部署centos7容器应用
(1)镜像下载
[root@docker-server ~]# docker pull daocloud.io/library/centos:7
[root@docker-server ~]# docker pull centos:7
(2) systemd 整合
因为 systemd 要求 CAPSYSADMIN 权限,从而得到了读取到宿主机 cgroup 的能力,CentOS7 中已经用 fakesystemd 代替了 systemd 。 但是我们使用systemd,可用参考下面的 Dockerfile:
[root@docker-server test]# vim Dockerfile
FROM daocloud.io/library/centos:7
MAINTAINER "soso" soso@qq.com
ENV container docker
RUN rm -rf /etc/yum.repos.d/*
ADD Centos-7.repo /etc/yum.repos.d/
RUN yum -y swap -- remove fakesystemd -- install systemd systemd-libs;RUN yum clean all; \
(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]
(3)构建镜像
这个Dockerfile删除fakesystemd 并安装了 systemd。然后再构建基础镜像:
[root@docker-server test]# docker build -t local/c7-systemd:v1.0 .
执行没有问题这就生成一个包含 systemd 的应用容器示例
(4)添加httpd应用
为了使用像上面那样包含 systemd 的容器,需要创建一个类似下面的Dockerfile:
[root@docker-server test]# mkdir http
[root@docker-server test]# cd http/
[root@docker-server http]# vim Dockerfile
FROM local/c7-systemd:v1.0
RUN yum -y install httpd; yum clean all; systemctl enable httpd.service
EXPOSE 80
CMD ["/usr/sbin/init"]
构建镜像:
[root@docker-server http]# docker build -t local/c7-systemd-httpd:v1.0 .
7.2部署docker web ui应用
下载并运行容器:
[root@docker-server ~]# docker pull uifd/ui-for-docker
[root@docker-server ~]# docker run -it -d --name docker-web -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock docker.io/uifd/ui-for-docker
浏览器访问测试: ip:9000
八、Docker端口转发
使用端口映射解决容器端口访问问题:创建应用容器的时候,一般会做端口映射,这样是为了让外部能够访问这些容器里的应用。可以用多个-p指定多个端口映射关系。
8.1mysql应用端口转发
运行容器:使用-p作端口转发,**把本地3307转发到容器的3306**,其他参数需要查看发布容器的页面提示
[root@docker-server ~]# docker pull daocloud.io/library/mysql:5.7
[root@docker-server ~]# docker run -d --name mysql1 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=Cloud@2024 daocloud.io/library/mysql:5.7
-e MYSQL_ROOT_PASSWORD= 设置环境变量,这里是设置mysql的root用户的密码
通过本地IP:192.168.246.141的3307端口访问容器mysql1内的数据库
1.安装一个mysql客户端
[root@docker-server ~]# yum install -y mysql
2.登录
[root@docker-server ~]# mysql -uroot -p'Cloud@2024' -h 192.168.246.141 -P 3307
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.26 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]>
-P(大P):当使用-P标记时,Docker 会随机映射一个 32768~49900 的端口到内部容器开放的网络端口
九、Docker容器卷管理
把本地宿主机上面的某一个目录挂载到容器里面的目录去。这两个目录都不用提前存在,会自动创建。
新卷只能在容器创建过程当中挂载
[root@docker-server ~]# docker run -it --name testnginx -v /test:/test2 daocloud.io/library/nginx /bin/bash
root@86320e734cd1:/# ls
root@86320e734cd1:/# ctrl+p+q #退出 ·
测试:
[root@docker-server ~]# cd /test/
[root@docker-server test]# ls
[root@docker-server test]# touch a.txt
[root@docker-server test]# cd
[root@docker-server ~]# docker exec -it testnginx /bin/bash
root@86320e734cd1:/# cd test2/
root@86320e734cd1:/test2# ls
a.txt
共享文件:
[root@docker-server ~]# mkdir /dir
[root@docker-server ~]# vim /dir/a.txt
123
[root@docker-server ~]# docker run -it --name testnginx2 -v /dir/a.txt:/dir1/a.txt daocloud.io/library/nginx /bin/bash
root@f899be627552:/# cat dir1/a.txt
123
共享其他容器的卷(其他容器用同一个卷):
[root@docker-server ~]# docker run -it --name testnginx1 --volumes-from testnginx daocloud.io/library/nginx /bin/bash
十、Docker网络管理
(1)Docker网络分类
查看当前网络:
[root@docker-server ~]# docker network list
NETWORK ID NAME DRIVER SCOPE
9b902ee3eafb bridge bridge local
140a9ff4bb94 host host local
d1210426b3b0 none null local
**docker安装后,默认会创建3种网络类型,bridge、host和none**
1)bridge:网络桥接,默认情况下启动、创建容器都是用该模式,所以每次docker容器重启时会按照顺序获取对应ip地址。
2)none:无指定网络,启动容器时,可以通过--network=none,docker容器不会分配局域网ip
3)host:主机网络,docker容器和宿主机共用一个ip地址
(2)异主容器互联
小规模docker环境大部分运行在单台主机上,如果公司大规模采用docker,那么多个宿主机上的docker如何互联
添加路由:
[root@docker-server1 ~]# route add -net 172.18.0.0/16 gw 192.168.246.143
[root@docker-server2 ~]# route add -net 172.17.0.0/16 gw 192.168.246.141
验证:
进入到docker-server1主机的centos容器中,ping docker-server2主机的centos容器,进行测试