欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Docker安装及使用

程序员文章站 2022-06-03 10:37:21
...

docker安装

  • 版本:

​ Docker19.03

​ Centos7.8

  • 配置docker国内源:阿里云

    参考:https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.140b1b11bwX1kc

  • 配置epel源:阿里云

    参考:https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.4ee91b11009TvV

安装docker

yum install -y yum-utils device-mapper-persistent-data lvm2  #安装一些系统工具
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo    #添加阿里云镜像地址
yum makecache fast     #更新yum缓存
yum -y install docker-ce docker-ce-cli containerd.io		#安装docker-ce版
systemctl start docker		#启动docker
systemctl enable docker		#开机自启
  • 配置阿里云镜像加速

    修改daemon配置文件/etc/docker/daemon.json来使用加速器

mkdir/etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://f3z6wzas.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload  
systemctl restart docker

docker卸载

$ sudo yum remove docker-ce docker-ce-cli containerd.io
$ sudo rm -rf /var/lib/docker

docker使用

docker架构图

Docker安装及使用

帮助命令

docker version       #docker版本信息
docker info          #docker详细信息

常用镜像命令

docker images #列出本地所有镜像

[aaa@qq.com ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
own_tomcat          1.0                 fdef511b25ad        25 hours ago        652MB
tomcat              latest              2eb5a120304e        47 hours ago        647MB
nginx               latest              2622e6cca7eb        2 days ago          132MB
mysql               latest              be0dbf01a0f3        3 days ago          541MB
centos              latest              470671670cac        4 months ago        237MB

#解释
REPOSITORY				#镜像仓库
TAG								#镜像标签
IMAGE ID					#镜像ID(唯一)
CREATED						#镜像创建时间
SIZE							#镜像大小

#命令参数可选项
-a,	--list				#列出所有镜像
-q,	--quiet				#只显示镜像ID

docker search #镜像搜索

[aaa@qq.com ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   9616                [OK]                
mariadb                           MariaDB is a community-developed fork of MyS…   3494                [OK]                
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   702                                     [OK]
centos/mysql-57-centos7           MySQL 5.7 SQL database server                   76                                      
mysql/mysql-cluster               Experimental MySQL Cluster Docker images. Cr…   69                                      
centurylink/mysql                 Image containing mysql. Optimized to be link…   61                                      [OK]
deitch/mysql-backup               REPLACED! Please use http://hub.docker.com/r…   41                                      [OK]
bitnami/mysql                     Bitnami MySQL Docker Image                      39                                      [OK]

#命令参数可选项
--filter=STARS=9000			#过滤STARS大于9000的镜像

docker pull #下载镜像

Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]				#不指定TAG默认下载最新版本
#例:
docker pull mysql            #下载mysql最新版本
docker pull mysql:5.7				#下载mysql5.7版本

docker rmi #删除镜像

docker rmi -f 镜像ID			#删除指定镜像
docker rmi -f 镜像ID 镜像ID 镜像ID	 #删除多个镜像
docker rmi $(docker images -qa) #删除全部镜像  等价于
docker images -qa | xargs docker rmi

常用容器命令

docker run

docker run [可选参数] image名称
#可选参数,注意防火墙端口放行,注意selinux
--name="name"				#指定容器名字
-d									#容器后台运行
#单独启动一个系统,没有启动应用或进程会自动停止,docker ps不会显示
-it									#使用交互运行方式,进入容器
-p									#指定容器端口
		-p 主机IP:主机端口:容器端口
		-p 主机端口:容器端口        #常用
		-p 容器端口
-P									#随机使用端口
#进入容器
exit								#退出容器并停止运行
Ctrl+p+q  					#退出容器不停止运行

docker ps

docker ps				#列出正在运行的容器
#可选参数
-a				#列出所有容器(正在运行的和已停止的容器)
-n=(数字)		#显示最近创建的容器
-q				#只显示容器编号

docker rm

docker rm 容器ID
docker rm $(docker ps -qa) #删除全部容器,不能产出正在运行的容器
等价于
docker ps -qa | xargs docker rm

容器启动与停止

docker start 容器ID					#启动容器
docker stop 容器ID					#停止容器
docker restart 容器ID				#重启容器
docker kill 容器ID					#强制停止容器

其他常用命令

docker logs	[可选参数] 容器ID			#查看容器的日志
#可选参数
-tf
		--tail [number]			#查看最后几条日志
docker top 容器ID				#查看容器内部进程
docker inspect [可选参数] 容器		#查看容器元数据
#进入正在运行的容器
docker exec -it 容器ID bashshell		#以交互方式进入正在运行的容器(进入一个新的终端)
docker attach 容器ID								#以交互方式进入正在运行的容器(进入已打开的终端)
#容器内拷贝文件到主机
docker cp [可选参数] 容器ID:容器内路径 主机目标路径

docker镜像加载原理

UnionFS(联合文件系统):是一种分层、轻量级并且高性能的文件系统。镜像实际是由一层一层的文件系统组成,镜像加载时是一层一层的加载。

Docker安装及使用

提交镜像

docker commit -m="描述信息" -a="作者" 容器ID 目标镜像名称:[标签]
#例
docker commit -m="add webapps" -a="jack" b9a1320a4f34 jack_tomcat:1.0

容器数据卷

容器的持久化和同步操作。同步操作相当于copy。

容器之间可以数据共享,容器删除,主机数据不会删除。容器停止运行,修改主机上的数据时,容器也会同步修改的。

修改容器数据时,可直接修改主机数据。

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止,但是一旦持久化到了本地,本地的数据是不会删除的。

使用数据卷

#一、使用命令直接挂载 -v
docker run -it -v 主机目录:容器目录
-v 容器内路径:[ro/rw]   #改变读写权限,一旦改变了容器权限,容器对我们挂载出来的内容就有限定了,默认rw权限。设定了ro,只能从主机上操作,容器内不能操作。

#具名挂载和匿名挂载

#匿名挂载,不指定主机目录
-v 	容器内路径
#查看所有卷volume
docker volume ls
#查看某个卷的详细信息
docker volume inspect 卷名

#具名挂载
-v 卷名:容器内路径

#3个容器数据卷同步,删除其中一个容器,另一容器的数据不会丢失。可实现mysql数据共享,数据同步。
#1.启动一个父容器,挂载数据卷
#2.启动子容器,使用--volumes-from挂载
--volumes-from 父容器名称
#3.启动第二个子容器,可以--volume-from挂载父容器或者子容器。

dockerfile

dockerfile是用来构建docker镜像的构建文件,命令脚本。

dockerfile文件可查看官方构建docker镜像的dockerfile文件。

构建docker镜像步骤:

1.编写一个dockerfile文件

2.docker build构建成为镜像

3.docker run运行镜像

4.docker push发布镜像,可以发布到dockerhub,阿里云等。

dockerfile文件指令

Docker安装及使用

#解释
FROM				#基础镜像
MAINTAINER	#镜像作者,姓名、邮箱
RUN					#镜像构建时需要运行的命令
ADD					#添加一个压缩包,会自动解压。
WORKDIR			#镜像的工作目录,进入容器时所在目录
VOLUME			#挂载目录
EXPOST			#暴露端口
CMD					#指定容器启动时要运行的命令,只有最后一个生效。
ENTRYPOINT	#指定容器启动时要运行的命令,可以追加命令。
ONBOUILD		#当构建一个被继承dockerfile会运行ONBUILD,触发指令
COPY				#类似ADD,将文件拷贝到镜像中
ENV					#构建时设置环境变量

#文件内容指令都为大写
#格式:指令	参数
#例1
#1.创建cnetos的dockerfile文件
FROM centos
MAINTAINER jack<aaa@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80

CMD echo $MYPATH
CMD echo "------end------"
CMD /bin/bash
#2.使用docker build构建镜像
docker build -f mydockerfile-Centos -t mycentos:1.0 .
#解释 
-f	#指定dockerfile文件路径
-t	#指定构建的镜像名称
.   #为当前目录

#例2
#1.准备镜像文件、readme.txt文件、tomcat压缩包、jdk压缩包下载到本地
		#dockerfile文件名为官方Dockerfile时build镜像时可不用指定dockerfile路径
#2.创建tomcat的dockerfile文件
FROM centos
MAINTAINER jack<aaa@qq.com>

COPY	readme.txt /usr/local/readme.txt

ADD jdk-***  /usr/local/
ADD apache-tomcat-*** /usr/local

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.***
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-***
ENV CATALINA_BASH /usr/local/apache-tomcat-***
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-***/bin/startup.sh && tail -f /usr/local/apache-tomcat-***/logs/catalina.out
#3.构建镜像
docker build -t mytomcat:1.0 .
#4.创建并启动容器
docker run -d -p 9090:8080 --name mytomcat01 -v /home/jack/build/mytomcat/test:/usr/local/apache-tomcat-***/webapps/test -v /home/jack/build/mytomcat/tomcatlogs/:/usr/local/apache-tomcat-**/logs/ mytomcat:1.0
#5.测试
#6.发布镜像
		#发布到dockerhub
		docker login -u 用户名 -p 密码    #登陆dockerhub
		docker push 用户名/mytomcat:1.0
		#发布到阿里云镜像
		#参考https://cr.console.aliyun.com/repository/cn-hangzhou/wjk-registry/test/details

docker网络

默认docker0网络

容器内部和主机之间可以直接通信,容器之间也可以直接通信。

每启动一个容器,docker都会给docker容器分配一个IP地址,只要安装了docker,就会自动生成一个docker0网卡,使用桥接模式,使用veth-pair技术。veth-pair是一对虚拟设备接口,他们是成对出现的。

每启动一个容器,主机与容器都会生成一对网卡。

只要删除一个容器,与之对应的一对网卡也会删除。

#查看容器内网卡
docker run -d -P --name tomcat01 ip add

#使用容器名称进行通信--link,如果两端都需要访问,两端都需要配置--link。--link原理是在容器内hosts文件中增加IP映射。
docker run -d -P --name tomcat02 --link tomcat01 tomcat
#查看容器详细信息
docker network inspect 容器ID

自定义网络

优点:不同集群使用不同网络,可保障集群的安全

#查看所有docker网络
docker network ls
#网络模式
bridge		#桥接
none			#不配置网络
host			#和宿主机共享网络
container	#容器网络联通(不常用)
#创建网络,直接启动容器默认使用docker0,也就是bridge,域名是不能访问的,可使用--link
docker network create --drive bridge --subnet 192.168.1.0/24 --gateway 192.168.1.254 mynet(#mynet为自定义名称)
#查看网络信息
docker network ls
docker network insepct mynet
#使用自定义网络启动容器,可以直接使用容器名互相ping通、通信
#加--ip可指定分配的IP地址
docker run -d -P --name tomcat-net-01 --net mynet --ip 192.168.1.1 tomcat
docker run -d -P --name tomcat-net-02 --net mynet --ip 192.168.1.2 tomcat

#打通默认网络和自定义网络,一个容器两个IP地址
docker network connect mynet tomcat01

#如果要夸网络操作,就需要使用docker network connect进行连通

docker使用过程中遇到的问题

问题:

问题1:

[aaa@qq.com ~]# docker run -d -p 9000:80 centos:httpd /bin/sh -c /usr/local/bin/start.sh
d5b2bd5a7bc4895a973fe61efd051847047d26385f65c278aaa09e4fa31c4d76
docker: Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen (6bda693d1143657e46bee0300276aa05820da2b21a3d89441e820d1a274c48b6): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9000 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1)).

原因:

docker服务启动时定义的自定义链DOCKER由于某种原因被清掉
重启docker服务及可重新生成自定义链DOCKER

解决:

重启docker服务后再启动容器

systemctl restart docker
docker run **

问题2: