1、安装
1.1、卸载旧的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
1.2、安装依赖
[root@docker ~]# yum install -y yum-utils
1.3、设置镜像仓库
国外镜像仓库,比较慢
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
推荐使用阿里国内源安装docker
[root@docker ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1.4、更新yum软件包
[root@docker ~]# yum makecache
安装docker相关的内容(最新版) docker-ce社区版 docker-ee企业版
[root@docker ~]# yum install docker-ce docker-ce-cli containerd.io
1.5、指定版本安装
查看版本
[root@docker ~]# yum list docker-ce --showduplicates | sort -r
指定版本
[root@docker ~]# yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
1.6、启动docker
[root@docker ~]# systemctl start docker
1.7、验证是否启动成功
[root@docker ~]# docker version
1.8、卸载docker
卸载依赖
[root@docker ~]# yum remove docker-ce docker-ce-cli containerd.io
删除资源路径
[root@docker ~]# rm -rf /var/lib/docker
1.9、配置阿里云镜像加速
[root@docker ~]# tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://krmu1x5v.mirror.aliyuncs.com"]
}
EOF
[root@docker ~]# systemctl daemon-reload
[root@docker ~]# systemctl restart docker
运行一个容器的流程
底层原理
Docker是一个Client - Server结构的系统,Docker的守护进程运行在主机上,通过Socket客户端访问 DockerServer接收到Docker-Client的指令, 就会执行这个命令
2、镜像管理
2.1、镜像命令
镜像打包(save打包的直接是一个镜像)
docker save -o image > name.tar
2.2、解压镜像
docker load -i < name.tar
2.3、运行一个容器导出镜像(export导出的是一个文件系统)
docker export 容器id > name.tar
2.4、导入镜像
docker import name.tar image(name)
2.5、docker images 查看本机的所有镜像
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 10 months ago 13.3kB
REPOSITORY 镜像的仓库源
TAG 镜像的版本
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
参数解释
-a //显示所有镜像
-q //只显示镜像ID
2.6、docker search 搜索镜像
[root@docker ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10202 [OK]
通过收藏来过滤
[root@docker ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10202 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3753 [OK]
2.7、docker pull 下载镜像
docker pull 镜像名
[root@docker ~]# docker pull mysql
Using default tag: latest //如果不写tag,默认是latest
latest: Pulling from library/mysql
852e50cd189d: Pull complete //分层下载,docker image的核心,联合文件系统
29969ddb0ffb: Pull complete
a43f41a44c48: Pull complete
5cdd802543a3: Pull complete
b79b040de953: Pull complete
938c64119969: Pull complete
7689ec51a0d9: Pull complete
a880ba7c411f: Pull complete
984f656ec6ca: Pull complete
9f497bce458a: Pull complete
b9940f97694b: Pull complete
2f069358dc96: Pull complete
Digest: sha256:4bb2e81a40e9d0d59bd8e3dc2ba5e1f2197696f6de39a91e90798dd27299b093 //签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest //真实地址
docker pull mysql 等价于 docker pull docker.io/library/mysql:latest
指定版本下载:docker pull mysql:5.7
2.8、docker rmi 删除镜像
删除指定镜像
[root@docker ~]# docker rmi -f dd7265748b5d
删除所有镜像
[root@docker ~]# docker rmi -f ${docker images -q}
3、容器管理
3.1、帮助命令
docker version #显示docker版本信息
docker info #显示docker的系统信息
docker --help #帮助命令
帮助文档地址:https://docs.docker.com/reference
3.2、新建容器并启动
docker run [可选参数] image
参数说明
--name="name" 容器名
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器端口
-P 随机指定端口
测试
[root@docker ~]# docker run -it centos /bin/bash
[root@b1a0d2d2e983 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
退出容器
[root@b1a0d2d2e983 /]# exit
3.3、列出所有运行的容器
docker ps 命令参数
-a 列出所有容器
-n=? 列出最近创建的容器
-q 只显示容器的ID
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b1a0d2d2e983 centos "/bin/bash" 5 minutes ago Exited (0) 5 minutes ago hopeful_gauss
85edd6ac145b hello-world "/hello" 2 hours ago Exited (0) 2 hours ago keen_chaum
[root@docker ~]# docker ps -a -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b1a0d2d2e983 centos "/bin/bash" 5 minutes ago Exited (0) 5 minutes ago hopeful_gauss
[root@docker ~]# docker ps -aq
b1a0d2d2e983
85edd6ac145b
3.4、退出容器
exit 直接退出容器并停止
Ctrl+p+q 退出容器并使容器正常运行
3.5、启动和停止容器
docker start 容器id //启动容器
docker restart 容器id //重启容器
docker stop 容器id //停止正在运行的容器
docker kill 容器id //强制停止正在运行的容器
3.6、删除容器
docker rm 容器id //删除指定容器,不能删除正在运行的容器
docker rm -f 容器id //删除指定容器,强制删除正在运行的容器
docker rm -f ${docker ps -aq} //删除所有容器
docker ps -aq |xargs docker rm -f //删除所有容器
常用其他命令
3.7、后台启动容器
docker run -d 镜像名
[root@docker ~]# docker run -f centos
常见的坑:docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止。
3.8、查看日志
docker logs -f -t --tail 行数 容器名
-tf //显示日志
--tail //显示日志条数
编写一个脚本启动一个容器查看日志
[root@docker ~]# docker run -d centos /bin/bah -c "while true;do echo liuchao;sleep 1;done"
[root@docker ~]# docker logs -f -t --tail 10 0929e13e8731
2020-11-24T09:20:31.671866039Z liuchao
2020-11-24T09:20:32.675777689Z liuchao
2020-11-24T09:20:33.684273188Z liuchao
2020-11-24T09:20:34.693939430Z liuchao
2020-11-24T09:20:35.698329347Z liuchao
2020-11-24T09:20:36.702976783Z liuchao
2020-11-24T09:20:37.710027107Z liuchao
2020-11-24T09:20:38.719628930Z liuchao
3.9、查看docker容器中进程信息
命令
docker top 容器id
[root@docker ~]# docker top 0929e13e8731
UID PID PPID C STIME TTY TIME CMD
root 10308 10290 0 17:20 ? 00:00:00 /bin/bash -c while true;do echo liuchao;sleep 1;done
root 10538 10308 0 17:22 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
3.10、查看镜像的元数据
docker inspect 容器id
3.11、进入当前正在运行的容器
docker exec -it 容器id /bin/bash
docker attach 容器id
docker exec //进入容器后开启一个新的终端,可以进行操作
docker attach //进入容器正在运行的字段,不会启动新的进程
3.12、从容器内拷贝文件到宿主机
docker cp 容器id:容器内路径 主机路径
[root@docker ~]# docker cp 0929e13e8731:/home/test /home
3.13、commit镜像
命令
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]
[root@docker ~]# docker commit -m="添加tomcat的webapps应用" -a="liuchao" 0929e13e8731 tomcat:1.0
3.14、容器日志存放路劲
ls /var/lib/docker/containers/容器id
--restart=always 加此参数会开机自启容器
4、容器数据卷
4.1、Volume数据卷形式
管理卷(以nginx为例)
docker volume create nginx-vol 创建管理卷
docker volume ls 查看
docker volume inspect nginx-vol 查看详细信息
4.2、用卷创建一个容器
docker run -d -it --name=nginx-text --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
4.3、清理
docker stop nginx-vol 停止容器
docker rm -f nginx-vol 删除容器
docker volume rm nginx-vol 删除管理卷
4.4、匿名挂载和具名挂载
-v 容器路径 //匿名挂载
[root@docker ~]# docker run -d -P --name nginx -v /etc/nginx nginx
-v 卷名:容器路径 //具名挂载
[root@docker ~]# docker run -d -P --name nginx -v juming-nginx:/etc/nginx nginx
-v 宿主机路径:容器路径 //指定路径挂载
[root@docker ~]# docker run -d -P --name nginx -v /nginx:/etc/nginx nginx
通过 -v 容器路径,ro 、rw改变读写权限
ro readonly //只读
rw readwrite //可读可写
//一旦设置了容器权限。容器对我们挂载出来的内容就有限制了
[root@docker ~]# docker run -d -P --name nginx -v juming-nginx:/etc/nginx:ro nginx
[root@docker ~]# docker run -d -P --name nginx -v juming-nginx:/etc/nginx:rw nginx
//只要看到ro就说明这个路径只能通过宿主机来操作,容器内无法操作!
4.5、数据卷容器(匿名挂载)
命令
docker run -d --name 名字 -p 映射端口 --volumes-from 要同步的容器名 镜像名
--volumes-from
例子:两个mysql之间实现数据共享
docker run -d --name mysql01 -p 3306:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 mysql:5.7
docker run -d --name mysql02 -p 3307:3306 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=123 mysql:5.7
结论:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止,但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的
https://docs.docker.com/storage/volumes/ 官方文档
5、DockerFile
参考文章:https://www.cnblogs.com/panwenbin-logs/p/8007348.html
5.1、FROM:指定基础镜像,必须为第一个命令
格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
示例:
FROM mysql:5.6
注:
tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
5.2、MAINTAINER: 维护者信息
MAINTAINER <name>
示例:
MAINTAINER Jasper Xu
MAINTAINER sorex@163.com
MAINTAINER Jasper Xu <sorex@163.com>
5.3、RUN:构建镜像时执行的命令
RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
shell执行
格式:
RUN <command>
exec执行
格式:
RUN ["executable", "param1", "param2"]
示例:
RUN ["executable", "param1", "param2"]
RUN apk update
RUN ["/etc/execfile", "arg1", "arg1"]
注:
RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
5.4、ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
示例:
ADD hom* /mydir/ # 添加所有以"hom"开头的文件
ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"
ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir
5.5、COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
5.6、CMD:构建容器后调用,也就是在容器启动时才进行调用。
格式:
CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)
示例:
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]
注:
CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
5.7、ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
格式:
ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
ENTRYPOINT command param1 param2 (shell内部命令)
示例:
FROM centos
ENTRYPOINT ["ls", "-al"]
注:
ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
5.8、LABEL:用于为镜像添加元数据
格式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:
LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
注:
使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
5.9、ENV:设置环境变量
格式:
ENV <key> <value> #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
示例:
ENV MYPATH /usr/local
WORKDIR $MYPATH
5.10、EXPOSE:指定于外界交互的端口
格式:
EXPOSE <port> [<port>...]
示例:
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp
注:
EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
5.11、VOLUME:用于指定持久化目录
格式:
VOLUME ["/path/to/dir"]
示例:
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
注:
一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
1 卷可以容器间共享和重用
2 容器并不一定要和其它容器共享卷
3 修改卷后会立即生效
4 对卷的修改不会对镜像产生影响
5 卷会一直存在,直到没有任何容器在使用它
5.12、WORKDIR:工作目录,类似于cd命令
格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)
注:
通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
5.13、USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
格式:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
示例:
USER www
注:
使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
5.14、ARG:用于指定传递给构建运行时的变量
格式:
ARG <name>[=<default value>]
示例:
ARG site
ARG build_user=www
5.15、ONBUILD:用于设置镜像触发器
格式:
ONBUILD [INSTRUCTION]
示例:
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
注:
当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
6、创建一个centoos镜像,使创建出的容器有vim、ifconfig命令
6.1、vim centos-dockerfile
FROM centos
MAINTAINER liuchao
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
6.2、构建镜像
docker build -f centos-dockerfile -t mycentos:1.0 .
6.3、如果构建报如下错误
Errors during downloading metadata for repository 'AppStream':
- Curl error (28): Timeout was reached for http://mirror.centos.org/centos/8/AppStream/x86_64/os/repodata/4cac32b46dd60ec129Less than 1000 bytes/sec transferred the last 30 seconds]
解决方法:查看yum源、如果yum源不好使,请下载阿里云yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo
运行 yum makecache 生成缓存 或 yum clean all
再重启docker服务
systemctl restart docker
7、Docker网络
7.1、四种模式
host模式:使用 --net=host 指定。
none模式:使用 --net=none 指定。
bridge模式:使用 --net=bridge 指定,默认设置。
container模式:使用 --net=container:NAME_or_ID 指定。
7.2、下面分别介绍一下Docker的各个网络模式
7.2.1、Bridge
相当于Vmware中的NAT模式,容器使用独立network Namespace,并连接到docker0虚拟网卡(默认模式)。通过docker0网桥以及Iptables nat表配置与宿主机通信;bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。下面着重介绍一下此模式
一个ens33对应一个veth-pair
下载插件yum -y install bridge-utils.x86_64
使用brctl show 详细查看
7.2.2、Host
相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
7.2.3、Container
在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信
7.2.4、None
该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。实际上,该模式关闭了容器的网络功能,在以下两种情况下是有用的:容器并不需要网络(例如只需要写磁盘卷的批处理任务)。
overlay
在docker1.7代码进行了重构,单独把网络部分独立出来编写,所以在docker1.8新加入的一个overlay网络模式。Docker对于网络访问的控制也是在逐渐完善的
7.3、容器互联(–link)
7.3.1、示例![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127160207698.png#pic_center)
7.3.2、两个容器不能通过容器名互通
解决方法:
#新建一个容器并加上--link参数
[root@docker ~]# docker run -d --name tomcat3 --link tomcat2 -P tomcat
d8498bfeb4610294bc066d03e940cb449881c9d41cef3d05eaf175e4be9bc158
#验证
[root@docker ~]# docker exec -it tomcat3 ping tomcat2
PING tomcat2 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat2 (172.17.0.3): icmp_seq=1 ttl=64 time=0.137 ms
64 bytes from tomcat2 (172.17.0.3): icmp_seq=2 ttl=64 time=0.056 ms
7.3.3、自定义网络
查看所有网络
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
8fdcd2ccc6c3 bridge bridge local
57cfc8362982 host host local
75a95d496e33 none null local
7.3.4、创建一个网络
[root@docker ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynetwork
7.3.5、查看网络信息
[root@docker ~]# docker network inspect mynetwork
[
{
"Name": "mynetwork",
"Id": "be633771b60b81c42f13fa351cc6fd43a871443ce96e870a18a12e39325cadfb",
"Created": "2020-11-27T16:13:34.949552367+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
7.3.6、删除网络
[root@docker ~]# docker network rm mynetwork
mynetwork
7.3.7、连接一个容器到一个网络
[root@docker ~]# docker network connect 网络名 容器名