Docker安装及学习
安装Docker
Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。
Docker CE 分为 stable
test
和 nightly
三个更新频道。
官方网站上有各种环境下的
1.CentOS安装Docker
1.1.卸载(可选)
如果之前安装过旧版本的Docker,可以使用下面命令卸载:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
1.2.安装docker
首先需要大家虚拟机联网,安装yum工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
然后更新本地镜像源:
# 设置docker镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
然后输入命令:
yum install -y docker-ce
docker-ce为社区免费版本。稍等片刻,docker即可安装成功。
1.3.启动docker
Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!
启动docker前,一定要关闭防火墙后!!
启动docker前,一定要关闭防火墙后!!
启动docker前,一定要关闭防火墙后!!
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
通过命令启动docker:
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
然后输入命令,可以查看docker版本:
docker -v
1.4.配置镜像加速
docker官方镜像仓库网速较差,我们需要设置国内镜像服务:
参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
2.CentOS7安装DockerCompose
2.1.下载
Linux下需要通过命令下载:
# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
上传到/usr/local/bin/
目录也可以。
2.2.修改文件权限
修改文件权限:
# 修改权限
chmod +x /usr/local/bin/docker-compose
2.3.Base自动补全命令:
# 补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
如果这里出现错误,需要修改自己的hosts文件:
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
3.Docker镜像仓库
搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。
官网地址:https://hub.docker.com/_/registry
3.1.简化版镜像仓库
Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。
搭建方式比较简单,命令如下:
docker run -d \
--restart=always \
--name registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry
命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录,这是私有镜像库存放数据的目录。
访问http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像
3.2.带有图形化界面版本
使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:
version: '3.0'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/lib/registry
ui:
image: joxit/docker-registry-ui:static
ports:
- 8080:80
environment:
- REGISTRY_TITLE=传智教育私有仓库
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
3.3.配置Docker信任地址
我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://192.168.150.101:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker
容器数据卷
坑!!
Docker挂在主机目录访问如果出现权限不足提示
解决办法:在挂载目录后多加一个 --privileged=true
介绍
-
容器数据卷的方式,可以完成数据的持久化重要资料backup
-
映射,容器内的数据备份+持久化到本机的目录中
-
有点类似redis中的rdb ref
是什么
卷就是目录或者文件,存在于一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System 提供一些用于持续存储或共享数据的特征
卷的设计就是数据的持久化,完全独立于容器的生命周期,因此Docker不会在容器中删除时删除其挂载的数据卷
能干嘛
Docker容器产生的数据,如果不备份,那么当容器删除之后,容器内的数据自然也就没有了
为了能保存数据,我们使用数据卷
特点
-
数据卷可以在容器之间共享或重用
-
卷中的更改直接实时生效
-
数据卷中的更改不会包含在镜像的更新中
-
数据卷的生命周期一直持续到没有容器使用为止
怎么用
#挂载
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录[:rw] 镜像名
#查看数据卷是否挂载成功
deocker inspect 容器id
#数据卷之间的继承
docker run -it --privileged=teue from 子名字 --name 父名字
数据卷和容器文件的读写规则
-
[:rw] 宿主机和容器都可读可写
-
[:ro] 宿主机可读可写,容器只可读
DockerFile
介绍
Dockfile是一种被Docker程序解释的脚本, Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令。 Dockerfile有自己书写格式和支持的命令, Docker程序解决这些命令间的依赖关系,类似于Makefile, Docker程序将读取Dockerfile,根据指令生成定制的image。
Dockerfile的指令是忽略大小写的,建议使用大写,使用#作为注释,每一行只支持一条指令 每条指令可以携带多个参数。
Dokerfile的指令根据作用可以分为两种, 构建指令和设置指令。构建指令用于构建 image,其指定的操作不会在运行image的容器上执行;设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。
是什么
Dockerfile是由一些列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像
能干嘛
-
对于开发人员:可以为开发团队提供一个完全一致的开发环境;
-
对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
-
对于运维人员:在部署时,可以实现应用的无缝移植。
Dockerfile 的书写规则及指令使用方法
1、FROM(指定基础image)
# 构建指令,必须指定且需要在Dockerfile其他指令的前面。后续的指令都依赖于该指令指定的image。FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库的tag版本。
FROM <image>:<tag>
FROM hub.c.163.com/netease_comb/debian:7.9
2、USER (设置指令,设置启动容器的用户,默认是root用户)
# 指定memcached的运行用户
ENTRYPOINT ["memcached"]
USER daemon
或
ENTRYPOINT ["memcached", "-u", "daemon"]
3、MAINTAINER(用来指定镜像创建者信息)
# 构建指令,用于将image的制作者相关的信息写入到image中。当我们对该image执行docker inspect命令时,输出中有相应的字段记录该信息。
MAINTAINER <name>
MAINTAINER Alenx
4、RUN(安装软件用)
# 构建指令,RUN可以运行任何被基础image支持的命令。如基础image选择了ubuntu,那么软件管理部分只能使用ubuntu的命令。
RUN <command> (the command is run in a shell - /bin/sh -c)
RUN ["executable", "param1", "param2" ... ] (exec form)
RUN apt-get install -y openssh-server apt-utils tomcat7
RUN rm -rf /var/lib/apt/lists/*
5、CMD(设置container启动时执行的操作)
# 设置指令,用于container启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条。
CMD ["executable","param1","param2"] (like an exec, this is the preferred form)
CMD command param1 param2 (as a shell)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD echo hello world
6、ENTRYPOINT(设置container启动时执行的操作)
# 设置指令,指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效
# 该指令的使用分为两种情况,一种是独自使用,另一种和CMD指令配合使用。当独自使用时,如果你还使用了CMD命令且CMD是一个完整的可执行的命令,那么CMD指令和ENTRYPOINT会互相覆盖只有最后一个CMD或者ENTRYPOINT有效。
ENTRYPOINT ["executable", "param1", "param2"] (like an exec, the preferred form)
ENTRYPOINT command param1 param2 (as a shell)
# CMD指令将不会被执行,只有ENTRYPOINT指令被执行
CMD echo “Hello, World!”
ENTRYPOINT ls -l
# 另一种用法和CMD指令配合使用来指定ENTRYPOINT的默认参数,这时CMD指令不是一个完整的可执行命令,仅仅是参数部分;ENTRYPOINT指令只能使用JSON方式指定执行命令,而不能指定参数
FROM ubuntu
CMD ["-l"]
ENTRYPOINT ["/usr/bin/ls"]
7、EXPOSE(指定容器需要映射到宿主机器的端口)
"""
设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。
要完成整个操作需要两个步骤,首先在Dockerfile使用EXPOSE设置需要映射的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。
也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。
端口映射是docker比较重要的一个功能,原因在于我们每次运行容器的时候容器的IP地址不能指定而是在桥接网卡的地址范围内随机生成的。
宿主机器的IP地址是固定的,我们可以将容器的端口的映射到宿主机器上的一个端口,免去每次访问容器中的某个服务时都要查看容器的IP的地址。
对于一个运行的容器,可以使用docker port加上容器中需要映射的端口和容器的ID来查看该端口号在宿主机器上的映射端口
"""
EXPOSE <port> [<port>...]
# 映射一个端口
EXPOSE port1
# 相应的运行容器使用的命令
docker run -p port1 image
# 映射多个端口
EXPOSE port1 port2 port3
# 相应的运行容器使用的命令
docker run -p port1 -p port2 -p port3 image
# 还可以指定需要映射到宿主机器上的某个端口号
docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image
docker run -d -p 127.0.0.1:33301:22 centos6-ssh
8、ENV(用于设置环境变量)
# 构建指令,在image中设置一个环境变量
ENV <key> <value>
# 设置了后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环境变量,也可以通过在docker run --env key=value时设置或修改环境变量。
# 假如你安装了JAVA程序,需要设置JAVA_HOME,那么可以在Dockerfile中这样写:
ENV JAVA_HOME /path/to/java/dirent
9、ADD(从src复制文件到container的dest路径
"""
构建指令,所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0;如果是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;
如果文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);如果<src>是文件且<dest>中不使用斜杠结束,则会将<dest>视为文件,<src>的内容会写入<dest>;
如果<src>是文件且<dest>中使用斜杠结束,则会<src>文件拷贝到<dest>目录下
"""
ADD <src> <dest>
# <src> 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url;
# <dest> 是container中的绝对路径
10、VOLUME(指定挂载点)
"""
设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。
我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。
"""
VOLUME ["<mountpoint>"]
FROM base
VOLUME ["/tmp/data"]
11、WORKDIR(切换目录)
# 设置指令,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效。
WORKDIR /path/to/workdir
# 在 /p1/p2 下执行 vim a.txt
WORKDIR /p1 WORKDIR p2 RUN vim a.txt
/bin/sh -c
12、ONBUILD(在子镜像中执行)
# ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行
ONBUILD <Dockerfile关键字>
Docker网络
简介
docker启动的时候,会在后台启动一个docker0的虚拟网桥,使用ifconfig可以查看
使用docker0来进行宿主机和容器之间的网路通信
网络命令模式
当我们安装docker后,默认会自动创建三个网络
#查看docker网络命令
docker network ls
#查看网络数据源
docker network inspect name
#删除网络
docker network rm name
能干嘛
-
容器间的互联和通信以及端口映射
-
容器ip变动的时候可以通过服务名直接网络通信而不受影响
网络模式
-
bridge模式:使用 --network bridge指定 ,默认使用docker0
为每一个容器分配、设置IP等,并将容器连接到一个docker0
-
host模式:使用 --network host指定
容器不会虚拟出自己的网卡,配置自己的ip等,而是使用宿主机的IP和端口
-
none模式:使用 --network none指定
容器由独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,IP等
-
container模式:使用 --network container:NAME或者容器ID指定
新创建的容器不会创建自己的网卡和配置自己的IP,而是指定一个容器共享IP、端口范围
Docker-Compose
是什么
是Docker官方的开源项目,负责实现对Docker容器集群的快速编排
可以管理多个Docker容器组成一个应用,需要定义一个YAML格式的配置文件 docker-compose.yml
写多个容器之间的调用关系,然后只需要下一个命令,就能同时启动/关闭这些容器
能干嘛
Compose允许用户通过一个单独的docker-compose.yml来定义一组相关联的应用容器为一个项目
可以很容易用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建
Docker-Compose解决了容器与容器黄子健的如果管理编排的问题
Compose核心概念
Compose常用命令
# 查看帮助
docker-compose -h
# 启动所有docker-compose服务
docker-compose up
# 启动所有的docker-compose服务并后台运行
docker-compose up
# 停止并删除容器、网络、卷、镜像
docker-compose down
# 进入容器实例内部
docker-compose exec yml中的服务id /bin/bash
# 展示当前docker-compose编排过得运行所有容器
docker-compose ps
# 展示当前docker-compose编排过的容器进程
docker-compose top
# 查看容器输出日志
docker-compose logs yml中的服务id
# 检查配置
docker-compose config
# 检查配置 只输出有问题的
docker-compose config -q
# 重启服务
docker-compose restart
# 启动服务
docker-compose start
# 停止服务
docker-compose stop
启动 Docker
sudo systemctl start docker
停止 Docker
sudo systemctl stop docker
重启 Docker
sudo systemctl restart docker
修改配置后重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
查看版本
docker version
查看Docker 信息
docker info
Docker 帮助
docker --help
镜像命令
查看Docker上已经安装的镜像
docker images
搜索Docker hub上面的镜像
docker search tomcat
下载镜像
docker pull tomcat[:version]
删除镜像
# 以删除tomcat为例
docker rmi tomcat[:version]
# 通过镜像ID删除
docker rmi -f 镜像ID
# 通过镜像ID删除多个
docker rmi -f 镜像名1:TAG 镜像名2:TAG
# 删除全部
# docker images -qa : 获取所有镜像ID
docker rmi -f $(docker images -qa)
容器命令
运行一个容器
docker run [options] image [command] [arg...]
常用参数:
-d: 后台运行容器,并返回容器ID
-i: 以交互式运行容器,通常与-t同时使用
-p: 端口映射,格式为 主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与-i同时使用
--name="name": 为容器指定一个名称
--dns 8.8.8.8: 为容器指定一个dns服务器,默认与宿主一致
--dns-search domain:为容器指定一个DNS域名,默认与宿主一致
-h "hostname": 指定容器的hostname
-e arg="value": 设置环境变量
-env-file=[]:从指定文件读入环境变量
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定的cpu运行
-m: 设置容器使用内存最大值
--net="bridge": 指定容器的网络连接类型,支持bridge/host/none/container四种类型
--link=[]:添加链接到另外一个容器
--expose=[]:开放一个端口或一组端口,宿主机使用随机端口映射到开放的端口
实例:
docker run --name mynginx -d nginx:latest
# 映射多个端口
docker run -p 80:80/tcp -p 90:90 -v /data:/data -d nginx:latest
查看正在运行的Docker 容器
docker ps
常用参数:
# 显示所有容器,包括当前没有运行的容器
-a
# 显示最近创建的容器
-l
# 显示最近创建的N个容器
-n
# 静默模式,只显示容器ID
-q
# 不截断输出
--no-trunc
退出容器
# 微信公众号:ITester软件测试小栈
# 退出并停止
exit
# 容器不停止退出
ctrl+P+Q
启动一个已经停止的容器
docker start 容器ID或容器name
重启容器
docker restart 容器ID或容器name
停止容器
docker stop 容器ID或容器name
强制停止容器
docker kill 容器ID或容器name
删除容器
# 删除已经停止的容器
docker rm 容器ID或容器name
# 强制删除已经停止或正在运行的容器
docker rm -f 容器ID或容器name
#一次性删除所有正在运行的容器
docker rm -f $(docker ps -qa)
从容器拷贝文件到
docker cp 容器ID或容器名称:/文件路径与文件名 宿主机地址
实例:
拷贝容器coco的tmp文件夹下的info.txt到宿主机的当前位置
docker cp coco:/tmp/info.txt .
日志命令
docker logs -f -t --tail 10 容器ID或容器名称
参数说明:
# 加入时间戳
-t
# 跟随最新的日志打印
-f
# 输出最后几行的日志
--tail 行数
实例:
docker logs -f -t --tail 10 5b66c8ab957e
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通