Docker安装及使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker安装及使用相关的知识,希望对你有一定的参考价值。

docker安装

  • 版本:

? Docker19.03

? Centos7.8

安装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 #列出本地所有镜像

[root@server1 ~]# 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 #镜像搜索

[root@server1 ~]# 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<123456@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<123456@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:

[root@localhost ~]# 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:

以上是关于Docker安装及使用的主要内容,如果未能解决你的问题,请参考以下文章

在Docker上安装keycloak及简单使用

docker安装步骤及基于docker容器部署web应用LNMP服务器环境

Docker: 基础介绍及配置安装 [一]

iscsi 自动挂载 及 docker安装 Docker的使用

Docker安装及Docker私有仓库部署流程

Docker的安装及简单使用