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 version #docker版本信息 docker info #docker详细信息
常用镜像命令
docker images #列出本地所有镜像
[ ~]# 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 #镜像搜索
[ ~]# 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 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文件指令
#解释 FROM #基础镜像 MAINTAINER #镜像作者,姓名、邮箱 RUN #镜像构建时需要运行的命令 ADD #添加一个压缩包,会自动解压。 WORKDIR #镜像的工作目录,进入容器时所在目录 VOLUME #挂载目录 EXPOST #暴露端口 CMD #指定容器启动时要运行的命令,只有最后一个生效。 ENTRYPOINT #指定容器启动时要运行的命令,可以追加命令。 ONBOUILD #当构建一个被继承dockerfile会运行ONBUILD,触发指令 COPY #类似ADD,将文件拷贝到镜像中 ENV #构建时设置环境变量 #文件内容指令都为大写 #格式:指令 参数 #例1 #1.创建cnetos的dockerfile文件 FROM centos MAINTAINER jack<> 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<> 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:
[ ~]# 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: