centos安装docker
1.卸载旧版的docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.更新yum包
sudo yum update
3.下载需要的安装包
下载命令: yum install -y yum-utils
若执行上面的命令报Error: Failed to download metadata for repo ‘appstream‘:类似的问题可以进行如下操作,出现此错误的原因是 CentOS 已经停止维护的问题。2020 年 12 月 8 号,CentOS 官方宣布了停止维护 CentOS Linux 的计划,并推出了 CentOS Stream 项目,CentOS Linux 8 作为 RHEL 8 的复刻版本,生命周期缩短,于 2021 年 12 月 31 日停止更新并停止维护(EOL),更多的信息可以查看 CentOS 官方公告。如果需要更新 CentOS,需要将镜像从 mirror.centos.org 更改为 vault.centos.org
首先,进入到 yum 的 repos 目录
cd /etc/yum.repos.d/
其次,修改 centos 文件内容
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
然后,生成缓存更新(第一次更新,速度稍微有点慢,耐心等待两分钟左右)
yum makecache
4.设置镜像的仓库,建议使用阿里云的,国外的网速巨慢!
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5.安装docker相关的配置,docker-ce 是社区版,docker-ee 企业版,正常推荐都是社区版
yum install docker-ce docker-ce-cli containerd.io
出现了completed即安装成功
6.启动Docker
systemctl start docker
#查看docker版本
docker version
#设置开机自启动
systemctl enable docker
常用的docker镜像命令
1. 在镜像库中搜索镜像
docker search 镜像名称
--也可以去dockerHub上去搜索具体的版本和详细的信息https://hub.docker.com/
2. 拉取/下载镜像
docker pull 镜像名称
-- 上面的方式会去自动拉取最新版本的镜像,若要指定版本可以指定版本进行下载
docker pull 镜像:镜像版本
例如:docker pull nginx:1.21
3. 查看本地仓库的镜像列表
-- 查看本地的顶层的镜像(实际上,在这里我们没有办法区分一个镜像和一个只读层,所以我们提出了top-level 镜像。只有创建容器时使用的镜像或者是直接pull下来的镜像能被称为顶层(top-level)镜像,并且每一个顶层镜像下面都隐藏了多个镜像层)
docker images
--查看所有的镜像
docker images -a
--如果你想要查看某一个image-id下的所有层,可以使用docker history来查看
docker history 镜像ID
4. 提交一个自己的镜像
当我们在别的镜像上做了修改想要把已经修改的镜像单独再保存一个镜像然后提交到image列表内
docker commit -a="作者" -m="提交的简介信息" 已经修改的容器ID 自定义的镜像名称:版本
例如: docker commit -a="Yin" -m="add to tomcat" 3a709db41501 tomcat02:1.0
常用docker容器命令
创建一个容器,关于镜像与容器的区别,容器的创建过程,其实docker run 命令是集成了两个命令,这里请参考这个博客https://www.cnblogs.com/bethal/p/5945038.html
docker run -it 镜像名称
docker run 的命令有很多,例如后台启动,指定端口启动,可以使用docker run --help查看
例如后台启动一个nginx镜像:
docker run -d --name nginx01 -p3344:80 nginx
-- 在dockerHub推荐用来测试镜像的命令,先下载镜像然后直接运行,停止后自动删除刚才运行的容器
docker run -it --rm 镜像名称:版本
1. 查看容器的详细信息
docker inspect 容器ID
-- 查看容器的耗费资源情况
docker stats 容器ID #添加容器ID就是查看指定容器的状态,否则查询全部的容器的状态
2. 进入当前正在运行的容器
方式一:docker exec -it 容器ID/容器名称 bashShell(进入容器开启一个新的终端,可在里面操作(常用))
例如:docker exec -it 137bf1a4e489 /bin/bash
方式二:docker attach 容器ID (进入容器正在执行的终端,不会启动新的进程)
3. 将容器中的文件拷贝到本机上
docker cp 容器ID:容器内文件的路径 目的主机路径
例如:docker cp 09b25008c9de:/home/test.txt /home
4. 查看容器列表
--查看本地正在运行中的容器,容器的状态有created(已创建),restarting(重启中),running(运行中),removing(迁移中),paused(暂停),exited(停止),dead(死亡)
命令1:sudo docker container ls
命令2:docker ps
-- 查看所有的容器,包括未运行的
docker ps -a
5. 删除容器
-- 删除单个容器,只会删除非运行状态的容器
docker rm -f 容器ID
-- 删除多个容器
#删除所未运行的容器
sudo docker rm $(sudo docker ps -a -q)
#删除Exited状态的容器
sudo docker rm $(sudo docker ps -qf status=exited)
#删除所有的容器,一般不推荐使用
sudo docker rmi $(docker images -q)
docker Portainer的应用
Portainer是Docker的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。
单机运行模式,直接运行在当前宿主机。并分配9000端口
docker run -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --name prtainer-test portainer/portainer
docker 使用容器卷
docker 容器卷是一种容器内外数据同步的一种技术,主要解决删除容器后容器内数据也一起被删除的问题,主要使用挂载目录来实现。
使用数据卷命令
dcoker run -v 主机目录:容器内目录
示例:将容器内的home目录与容器外的、home/ceshi 目录进行数据共享
docker run -it -v /home/ceishi:/home centos /bin/bash
示例2:运行mysql (mysql需要设置密码,可参考docker hub)
docker run -d -p 3310:3306 -v /home/mysql:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
具名挂载和匿名挂载
-- 匿名挂载 只写容器内的路径,并没有写容器外的路径
-v 容器内路径
示例:
docker run -d -P --name nginx01 -v /etc/nginx nginx
-- 具名挂载 指定卷名
-v 卷名:容器内路径
示例:
docker run -d -P --name nginx02 -v juan-name:/etc/nginx nginx
-- 查看容器挂载的卷列表
docker volume ls
--查看卷挂载的详细信息
docker volume inspect 卷名
挂载时数据卷时设置权限
-- 挂载时设置只读权限,设置只读之后,容器内将不能修改只能通过宿主机来操作
例:docker run -d -P --name nginx02 -v juan-name:/etc/nginx:ro nginx
-- 挂载时设置读写权限
例:docker run -d -P --name nginx02 -v juan-name:/etc/nginx:rw nginx
DockerFile的介绍和使用
dockerflie 是用来构建docker镜像的文件! 命令参数的脚本!
DockerFile构建的镜像的步骤:
1.编写一个dockerfile文件
2.使用 docker build 命令构建成为一个镜像
3.docker run 运行镜像
4.docker push 发布镜像(DockerHub,阿里云镜像仓库!)
DockerFile的构建过程
1.每个保留关键字(指令)都必须是大写字母。
2.执行从上到下顺序执行
3.#表示注释
4.每一个指令会创建和提交一个新的镜像层,并提交!
DockerFIle的指令
FROM #基础镜像,一切在这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #添加其他镜像或文件
WORKDIR #镜像的工作目录
VOLUME #挂载的目录,
EXPOSE #保留端口配置
CMD #指定这个容器启动的时候需要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候需要运行的命令,可以追加命令
COPY #类似于ADD,将文件拷贝带镜像中
ENV #构建的时候设置环境变量
创建一个自己的centos镜像
编写dockerfile文件
FROM centos
MAINTAINER yin
ENV MYPATH /usr/local
WORKDIR $MYPATH
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 -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
创建一个镜像
# docker build -f dockerfile的文件路径 -t 镜像名:版本
docker build -f mydockerfile-centos -t mycentos:0.1 .
# 若当前目录下的镜像文件名为Dockerfile则可以省略 -f 文件名
docker bulid -t mycentos:0.1 .
创建一个带有jdk的Tomcat镜像
FROM centos
MAINTAINER yin
#拷贝自己创建的一个文档
COPY readme.txt /usr/local/readme.txt
#将事先准备的的压缩包添加到镜像中
ADD jdk-8u261-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.57.tar.gz /usr/local/
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 -y install vim
#设置工作目录
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_261
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.57
ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.57
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:CATALINA_HOME/bin
#暴露端口
EXPOSE 8080
#启动Tomcat
CMD /usr/local/apache-tomcat-8.5.57/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.57/bin/logs/catalina.out
将镜像打包成tar包,gz包,以及将将tar包生成镜像
#将镜像打包成tar包
docker save -o xxx.tar imagexxx # 当前路径下会生成一个xxx.tar
docker save -o electric_know_1.31_0.tar electric_know_1.31_0:latest
#将tar包再次压缩为gz包
tar -zcvf xxx.tar.gz xxx.tar # 当前路径生成一个xxx.tar.gz压缩包
#将tar.gz 解压缩,会生成一个tar包
tar -zxvf xxx.tar.gz
#将tar包生成镜像
docker load --input XXXX.tar
将自己的镜像推送到阿里云
1.登录阿里云
2.找到容器镜像服务
3.创建自己的命名空间和镜像仓库
4.创建自己的仓库后阿里云有详细的教程,根据教程命令推送即可
docker流程图
Docker网络
理解docker0网络
1.一般我们使用云服务器安装docker服务时一般会有三个网卡
2.当我们运行一个镜像并进入查看镜像的IP时发现docker会自动给镜像分配一个ip
3.当我们退出容器到宿主机在查看网卡的时候,我们发现多了一对网卡,多的其实就是启动的容器的网卡
每增加一个容器。就会相应的增加一对网卡,他们一端连着协议,一端彼此相连,运用的是evth-pair桥接,这样容器与容器之间就可以通信了
4.docker网络通信简图
在不设置网络的情况下所有的容器都共用一个路由器,那就是docker0,docker0会给我们所有的容器来分配一个默认的可用ip
5.容器互联 --link与自定义网络
场景描述:我们的微服务项目中需要连接一个数据库的容器,而每当数据库容器重新启动的时候对应的容器ip则会改变,这样就每次都要在项目中修改数据库的容器ip,为了解决这个问题我们用到了 --link 命令,他可以直接将两个容器连接起来,直接ping 容器名称即可。(注意:–link 只可以正向连接不可以反向连接,而且现在已经不建议使用这种方式进行互联了,这种方式有局限性,一般使用自定义网络)
#使用centos03 连接 centos02 这样我们就可以使用centos03 直接ping centos02了,但是centos02不可以ping通centos03
docker run -d -P --name centos03 --link centos02 centos:latest
那centos03是怎样实现和centos02互联的呢,其实link命令是将centos02的地址写进了centos03的hostst文件内
自定义网络
#查看所有docker网络列表
docker network ls
网络模式:
bridge : 桥接(docker 默认的)
npne : 不设置网络
host : 和宿主机共享网络
container 容器网络连通(用的少,局限性很大)
#之前我们的启动容器的命令
docker run -d -P --name cnteos01 centos
#其实这里面有一个默认的参数,默认的就是docker0网络,docker0不能使用域名访问
docker run -d -P --name cnteos01 --net bridge centos
创建一个自己的docker网络
#docker network create --driver 网络类型 --subnet 子网掩码 --gateway 网关地址 自定义网络名称
#遇到问题可以使用 docker network --help 来查看各个命令的详解
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
#在自己创建的网络下创建两个容器。然后再查看网络则会发现在自己的网络上多了另个容器地址
docker run -d -it -P --name centos-net-01 --net mynet centos
docker run -d -it -P --name centos-net-02 --net mynet centos
自定义网络与docker0的对比的命令的对比:自定义网络可以ping ip也可以直接使用容器名
好处:我们可以通过自定义的网络建立不同的集群,而不同的网络又是相互隔离的。从而保证了集群的健康和安全
不同集群示意图(之间相互隔离,同时docker也给我们提供了不同集群之间相互通信的解决方案)
实现两个网络的互联
首先我们现在有两个docker的网络环境一个默认的docker0网络一个mynet网络我们上边已经向mynet中放入了两个容器现在我们向docker0中放入两个
两个网络要想互通并不能网络中的容器之间直接打通,而是要一个网络中的容器跟另一个网络打通,
需要用到以下命令将一个容器跟一个网络打通
将mynet网络与docker0中的cenos01连通,连通之后就是将centos01加到了mynet网络中了
我们在查看centos01就会发现这个容器有了两个地址,一个mynet网络的地址,一个docker0的地址
docker inspect centos01
这样就可以实现互通了