安装前准备:一个centos服务器,操作系统版本必须在3.10及以上
uname -r:查看操作系统的发行版本
目录
2.同一网段下宿主机与容器、容器与容器之间的ip是可以ping通的
3.使用使用 --link参数实现同一网络下容器之间单向连接
一、Docker的安装、卸载
1.安装Docker
1.删除旧版本docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.安装gcc环境
yum -y install gcc
yum -y install gcc-c++
3.配置docker仓库:(这儿用的是国内阿里云的仓库)
yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.更新yum索引
yum makecache fast
5.安装docker
yum install -y docker-ce docker-ce-cli containerd.io
6.启动docker
systemctl start docker
7.配置镜像加速:此处采用的阿里云的:(登录自己的阿里云账号,找到控制台-容器镜像服务-镜像工具-镜像加速器)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://pdg27cfz.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
--------至此:docker就安装成功了--------
8.查看docker版本
docker --version
2.启动、暂停、重启Docker
1.查看docker运行状态
systemctl status docker
2.启动docker
systemctl start docker
3.停止docker
systemctl stop docker
4.重启docker
systemctl restart docker
注意:
如果执行"停止docker命令"后报下面这句话不用理会,这是docker自动唤醒机制,它的意思时再次执行任意docker命令就会自动启动docker
Warning: Stopping docker.service, but it can still be activated by:
docker.socket
3.卸载Docker
1.停止docker
sudo systemctl stop docker
2.删除上面第5步安装的docker组件
sudo yum remove docker-ce docker-ce-cli containerd.io
3.删除docker相关的镜像容器等数据信息
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
二、Docker常用命令
1.Docker的帮助命令
1.查看docker版本信息
docker --version
2.查看docker详细信息
docker info
3.docker帮助命令
docker --help
4.查看某个命令的帮助文档,如images
docker images --help
2.镜像常用命令
1.搜索镜像
docker search 镜像名
参数:
--filter=STARS=数量:搜索STARS在多少以上的
示例:
1.搜索mysql镜像
docker search mysql
2.搜索STARS数在20以上的mysql镜像
docker search mysql --filter=STARS=20
2.拉取镜像
docker pull 镜像名
参数:
:版本号:拉取指定版本的镜像
示例:
1.拉取mysql镜像:默认拉取最新版的
docker pull mysql
2.拉取mysql5.7镜像
docker pull mysql:5.7
3.查看镜像
docker images
参数:
-a:查看所有镜像,默认参数
-q:只显示镜像id
示例:
1.查看所有镜像
docker images -a
2.查看镜像id
docker images -q
3.查看所有镜像的镜像id
docker images -aq
4.删除镜像
docker rmi 镜像id
参数:
-f: 强制删除:创建了容器之后不能直接删除镜像,可以加上-f参数强制删除
示例:
1.删除单个镜像
docker rmi -f 镜像id
2.删除多个镜像
docker rmi -f 镜像1id 镜像2id
3.删除所有镜像
docker rmi -f $(docker images -aq)
3.容器常用命令
1.docker run [可选参数] 镜像名
#参数说明
1.指定容器名字
--name 容器名
2.以后台方式启动
-d
3.以交互方式启动
-it
4.指定容器端口
-p 主机端口:容器内端口
5.随机指定端口
-P
示例:
1.以交互方式运行centos容器
docker run -it --name mycentos centos /bin/bash
2.退出容器
exit 退出并停止容器
Ctrl+P+Q 退出不停止容器
3.docker ps
#参数说明
-a:查看所有容器
-q:查看容器id
-n:查看最近运行的n个容器
示例:
1.查看正在运行的容器
docker ps
2.查看所有的容器
docker ps -a
3.查看正在运行的容器的id
docker ps -q
4.查看所有的容器id
docker ps -aq
5. 列出最近运行的n个容器
docker ps -n=?
4.启动和停止容器
docker start 容器id //启动退出的容器
docker restart 容器id //重启容器
docker stop 容器id //停止容器
5.docker rm
#参数说明
-f 强制删除,正在运行的容器不让删除,必须加上-f参数
示例:
1.删除单个容器
docker rm -f 容器id
2.删除多个容器
docker rm -f 容器1id 容器2id
3.删除所有容器
docekr rm -f $(docker ps -qa)
6.进入正在运行的容器
1.docker exec
docker exec -it 容器id /bin/bash //以指定终端的方式进入容器,这儿指定的是/bin/bash,也可以是其它的
2.docker attach
docker attach 容器id //进入正在运行的终端
4.Docker的常用命令
1.查看容器的进程
docker top 容器id
2.查看容器的日志
docker logs 参数 容器id
#参数
-t //显示时间
-f //显示最新日志
--tail 行数 //显示多少行
示例:
这个命令会打印出容器内输出的内容,此时没有服务器打印的日志可以进入容器做些操作模拟
1.运行一个容器,比如centos
docker run -it --name mycentos centos /bin/bash
2.进行服务器操作
ls
cd /home
mkdir test
cd test
touch test.txt
3.Ctrl+P+Q退出容器
4.查看日志
docker logs 容器id
3.将容器内文件拷贝到宿主机
docker cp 容器id:容器内的路径 宿主机的路径
4.查看容器的元数据信息
docker inspect 容器id或者挂载id
5.查看挂载(容器卷)列表
docker volume ls
6.将镜像打包成压缩包
docker save -o 压缩包名.tar.gz 镜像:版本号
7.从压缩包加载镜像
docker load -i 压缩包名.tar.gz
8.将DockerFile文件编译成镜像
docker build -f dockerfile文件 -t 镜像名:版本号 .
9.查看镜像构建历史
docker history 镜像id
5.将容器制作成镜像
命令:
docker commit -m="注释信息" -a="作者" 容器id 自定义的镜像名:版本号
示例:
以Tomcat为例:阿里云官方镜像的tomcat,webapps下是没有东西的,所以直接访问找不到页面,自定义一个tomcat,将webapps下东西补全
1.下载镜像
docker pull tomcat
2.后台运行镜像
docker run -d --name tomcat -p 8080:8080 tomcat
3.此时浏览器访问是看不到内容的
4.进入容器
docker exec -it 容器id /bin/bash
5.此时进入webapps目录下,发下目录是空的;将webapps.dist目录下的东西复制到webapps目录下
cp -r webapps.dist/* webapps/
6.此时外网访问8080就可以访问到内容了
7.将容器提交制作一个自定义的镜像
docker commit -m="mytomcat" -a="ling" 容器id mytomcat:1.0
8.停止旧容器
docker stop 容器id
9.运行新创建的镜像
docker run -d -p 8080:8080 mytomcat:1.0
10.浏览器访问8080端口,可以正常访问页面
注意事项:访问不到的记得开启服务商防火墙策略和服务器本地端口
6.目录挂载的三种方式
1:指定宿主机路径挂载:docker volume ls 看不到挂载信息
格式:
-v 宿主机路径:容器内路径
示例:
1.创建一个centos容器,实现容器和宿主机的目录挂载
docker run -it -v /home/test:/home/test --name gzcentos centos /bin/bash
2.在容器内test目录下创建一个test.txt文件,在宿主机/home/test目录下也可以看到这个文件
touch test.txt
3.在容器/宿主机内修改文件内容,挂载的双方也都可以看到
4.在宿主机上停止容器,修改宿主机的文件内容
5.重启后容器内依然能看到修改后的数据
6.使用docker inspect 容器id可以看到Mounts下的挂载信息
2.匿名挂载:docker inspect 容器id (Mounts下是看不到挂载信息的)
格式:
-v 容器内路径
示例:
1.创建一个centos容器,实现容器和宿主机的匿名挂载
docker run -it -v /home/test1 --name nmcentos centos /bin/bash
2.在容器内test1创建一个test1.txt文件
touch test1.txt
3.查看挂载列表目录
docker volume ls
4.查看挂载目录
docker inspect 挂载id
5.此时看到了挂载到的宿主机目录,也实现了容器跟宿主机目录的挂载
3.具名挂载:(docker volume ls 和docker inspect 容器id 都能看到挂载信息)
格式:
-v 卷名:容器内路径
示例:
1.创建一个centos容器,实现容器和宿主机的具名挂载
docker run -it -v jmcentos:/home/test2 --name jmcentos centos /bin/bash
2.在容器内test2目录下创建一个test1.txt文件
touch test2.txt
3.查看挂载目录
docker inspect 容器id
4.此时看到了挂载到的宿主机目录,也实现了容器跟宿主机目录的挂载
注意:通过观察发现,匿名挂载和具名挂载,宿主机目录都在下面目录下
/var/lib/docker/volumes/匿名id或具名/_data
三、DockerFile
1.DockerFile概念
1.概念
DockerFile是一个命令参数脚本,是用来构建docker镜像的脚本文件
2.构建镜像的步骤
1.编写一个dockerFile文件
2.docker build 构建成一个镜像
3.docker run 运行镜像构建容器
4.docker push 发布镜像(dockerhub/阿里云镜像仓库等等)
3.DockerFile脚本文件
1.每个关键字都必须大写
2.执行从上往下顺序执行
3.# 表示注释
4.每个指令都出创建一个新的镜像层并提交
4.dockerFile指令
FROM #设置基础镜像,当前镜像是基于哪个镜像的
MAINTAINER #镜像作者 姓名<邮箱>
RUN #镜像构建的时候需要运行的命令
ADD #将宿主机目录中的文件拷贝到镜像中,压缩包会自动解压
WORKDIR #镜像的工作目录,用户一进来就进入的目录
VOLUME #挂载的目录
EXPOSE #暴露的端口
CMD #指定容器启动时运行的命令,run时指定命令会替换掉最后一个CMD命令
ENTRYPOINT #指定容器启动时运行的命令,run时指定命令会拼接在最后一个ENTRYPOINT命令后面
ONBUILD #触发器,当构建的镜像被另一个dockerFile继承时触发
COPY #将文件拷贝到镜像中
ENV #构建的时候设置环境变量
2.使用DockerFile脚本制作一个centos
阿里云的centos是没有vim和ifconfig命令的;使用DockerFile脚本基于centos镜像添加上这两个组件,制作出一个新镜像.
1.创建一个目录用于存放DockerFile脚本(我用root登陆的,就放在root下了,位置无所谓,可以自行选择)
mkdir /root/DockerFiles/mycentos
2.进入目录
cd /root/DockerFiles/mycentos
3.创建DockerFile脚本
touch DockerFile
4.编辑脚本
# 基于centos镜像
FROM centos
# 作者信息
MAINTAINER ling<xxx@163.com>
# 环境定义了个MAINPATH
ENV MAINPATH /home/ling
# 工作目录指定了环境变量定义的目录
WORKDIR $MAINPATH
# centos最新镜像没有vim,安装会失败解决方案
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum makecache
RUN yum update -y
#安装vim和net-tools
RUN yum -y install vim
RUN yum -y install net-tools
#输出信息
CMD echo $MAINPATH
CMD echo "---------build end---------"
CMD /bin/bash
5.使用docker build将DockerFile脚本构建成镜像
docker build -f DockerFile -t mycentos:1.0 .
6.运行镜像
docker run -it --name mycentos mycentos:1.0 /bin/bash
7.测试vim和ifconfig功能
3.CMD和ENTRYPOINT的区别
CMD:运行镜像时添加的参数会替换掉最后一条CMD命令
ENTRYPOINT:运行镜像时添加的参数会拼接在最后一条ENTRYPOINT命令后面成为一条新的命令
1.CMD命令测试
# 编写一个Dockerfile文件
FROM centos
# docker run执行以后,你想要添加新命令参数,无法直接添加,而是需要编写完整的命令,CMD的使用
CMD ["ls","-a"]
# 构建成一个镜像
docker build -f DockerFile文件 -t 镜像名:版本号 .
# 运行测试
docker run 镜像id -l //执行失败,此时实际执行的是 -l
docker run 镜像id ls -al //执行成功
2.ENTRYPOINT命令测试
# 编写一个Dockerfile文件
FROM centos
# docker run传递参数的时候,拼接到 ENTRYPOINT 指令中,不传就是执行默认的
ENTRYPOINT ["ls","-a"]
#构建成一个镜像
docker build -f dockerfile文件 -t 镜像名:版本号 .
#运行测试
docker run 镜像id -l //执行成功
四、将本地制作好的镜像推送到阿里云私人仓库
1.登陆阿里云,在控制台搜索容器镜像服务
2.2.创建个人版实例,并设置密码
3.创建一个命名空间
4.创建一个镜像仓库,并选择本地仓库
5.根据提示向阿里云私人仓库推送拉取镜像
6.推送完成后可在镜像版本中查看
五、Docker网络
由于容器的每次启动,宿主机和容器之间就会分配一对新的ip;为方便观察学习,这儿先清空了本地的镜像和容器
# 清空容器
docker rm -f $(docker ps -aq)
# 清空镜像
docker rmi -f $(docker images -aq)
1.概念
1.在宿主机先用ip addr命令查看下网络信息;此时可以看到本地回环地址、网卡、docker0三个网段,其中docker0网段是docker默认的网络.
2.由于docker0网段是docker的默认网络,所以启动容器时不指定网络的情况下,默认都会分配在docker0网络下;由于容器在同一个网段下,所以容器之间网络也是互通的.
2.同一网段下宿主机与容器、容器与容器之间的ip是可以ping通的
示例1:
测试宿主机与容器之间网络的连通性
1.启动一个容器:[此处测试用的是centos镜像,镜像是什么无所谓,可以自行选择;当然,有些容器中没有ip addr命令,需要进行安装]
docker run -itd --name centos01 centos /bin/bash
2.宿主机输入 ip addr命令可以看到多了一个网络信息
ip addr
3.进入容器
docker exec -it 容器id /bin/bash
4.容器内输入 ip addr命令查看网络信息,可以看到一个ip地址
ip addr
5.退出容器
Ctrl+P+Q
6.测试宿主机和容器之间的网络连通性
ping 容器id地址
结论:如果操作没有问题,此时网络应该可以看到是连通的
示例2:
测试容器与容器之间网络的连通性
1.再启动一个容器
docker run -it --name centos02 centos /bin/bash
2.在容器内输入 ip addr命令,此时可以看到,centos01和centos02容器在同一个网段下
ip addr
3.测试容器centos01和容器centos02之间的网络连通性
ping centos01容器的地址
结论:如果操作没有问题,此时网络应该也可以看到是连通的
问题:由于每次容器重启都会分配一个新的ip,所以使用容器安装数据库这些软件,容器挂掉了重启后ip就变了,那连接ip应该写什么呢?
解决:使用容器名进行连接
2.使用容器名测试容器与容器之间的网络连通性
1.在centos01输入
ping centos02
2.在centos02输入
ping centos01
3.在宿主机输入(宿主机和容器之间使用容器名是无法ping通的,无需解决)
ping centos01
ping centos02
问题:此时发现所有的都ping不通,那应该怎么解决呢?
解决:使用--link参数或network命令
3.使用使用 --link参数实现同一网络下容器之间单向连接
格式:
--link 要连接到的容器名
1.创建一个新容器连接到之前的容器
docker run -it --name centos03 --link centos02 centos /bin/bash
2.测试centos03与centos02的网络连通性
ping centos02 这个是可以连通的
ping centos01 这个是没有连通的
3.进入centos02容器测试与centos03容器的连通性
docker exec -it centos02容器id /bin/bash
ping centos03 这个是没有连通的
4.重启centos02
docker restart centos02容器id
5.此时centos02容器的ip地址没有改变,在centos03中依旧能ping通
6.实际上就是在centos03容器的/etc/hosts文件中增加了一条映射信息
cat /etc/hosts
docker0网络的特点:
1.默认网络:容器不指定网络就是docker0网络
2.无法通过容器名访问
问题:此时就只创建了centos03容器到centos02容器的一个正向的连接;反向也是ping不通的,[不推荐使用]
解决:使用network命令实现容器之间双向的互通
4.使用network命令实现同一网络下容器之间双向的互通
网络模式一共有以下几种
bridge模式 --net=bridge 默认值,docker0使用的就是这个
自定义网络 --net=自定义网络 用户自定义网络,创建容器的时候可以添加这个参数指定自定自己的网络
host模式 --net=host 容器和宿主机共享网络
none模式 --net=none 不配置网络,用户可以进入容器后自行配置网络信息
container模式 --net=container:name/id 容器和另外一个容器共享Network namespace, kubernetes中的pod就是多个容器共享一个Network namespace.
1.自定义一个网络
# 格式:docker network create --driver 模式 --subnet 网段 --gateway 网关 网络名
docker network create --driver bridge --subnet 172.16.0.0/16 --gateway 172.16.0.1 mydockernet
2.查看网络列表,可以看到多了一个自定义的网络
docker network ls
3.创建容器指定网络为自定义的网络
docker run -itd --name centos04 --net mydockernet centos /bin/bash
4.再创建一个容器,网络还是指定自定义的网络
docker run -it --name centos05 --net mydockernet centos /bin/bash
5.在centos05下测试与centos04的网络连通性
ping centos04的容器ip //可以连通
ping centos04 //可以连通
6.在centos04下测试与centos05的网络连通性
ping centos05的容器ip //可以连通
ping centos05 //可以连通
结果:此时就实现了统一网络下容器名网络的连通性问题
注意:数据库等组件连接时,记得将ip替换为容器名
自定义网络使用场景
1.同一个项目可以自定义一个网络,不同项目之间实现网络隔离效果
2.统一个服务集群也可以自定义一个网络
5.不同网络之间容器的连通
1.进入centos05容器
docker exec -it centos05容器的id /bin/bash
2.测试centos05容器与centos01容器的连通性
ping centos01 //ping不通
3.将centos01容器添加到自定义网络中 格式: docker network connect 网络名 容器名
docker network connect mydockernet centos01
4.进入centos05容器
docker exec -it centos05容器的id /bin/bash
5.测试centos05容器与centos01容器的连通性
ping centos01 //可以ping通
6.进入centos01容器
docker exec -it centos01容器的id /bin/bash
7.测试centos01容器与centos05容器的连通性
ping centos05 //可以ping通
# 此时就实现了不同网段下容器之间网络互通