赞
踩
Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition:社区版) 和 EE(Enterprise Edition:企业版),我们用社区版就可以了。
镜像(Image):Docker 镜像(Image)就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
如果使用的账号不是root账号,需要使用 sudo
前缀,使用root相关权限执行命令,后续命令中省略 sudo
命令,如果权限不足,请自行加上该前缀。
yum install xxx
sudo yum install xxx
# 删除相关组件 # 如果使用种方式的话,需要罗列全部使安装过的组件; yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine # 第二种方式,使用匹配符直接删除全部 # 推荐使用第二种方式,无需罗列所有的安装组件 yum remove docker docker-* # 删除注册的服务 rm -rf /etc/systemd/system/docker.service.d # 删除docker工作目录 rm -rf /var/lib/docker* rm -rf /var/run/docker* # 删除配置文件 # 直接清空这个文件夹,下面所有配置都将被清空 rm -rf /etc/docker #----------------------------# # /etc/docker/daemon.json # # /ect/docker/key.json # #----------------------------# # 查找残留的docker rpm -qa|grep docker
# 查看docker版本号 yum list docker-ce --showduplicates|grep "^doc"|sort -r # 第一步,需要安装一些依赖组件 # 安装所需的软件包。yum-utils 提供了 yum-config-manager, # 并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。 yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 # 使用以下命令来获得稳定的仓库 # 阿里云源地址速度相对比较快,这里是设置源地址为阿里云的镜像仓库地址。 yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安装 Docker Engine-Community sudo yum install docker-ce-20.10.4-3.el7 docker-ce-cli-20.10.4-3.el7 containerd.io-1.6.28-3.2.el7 # Docker默认未启动,需要手动重启docker服务 systemctl daemon-reload && systemctl start docker && systemctl enable docker
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [ "https://fpr97nhz.mirror.aliyuncs.com" ]
}
EOF
sudo systemctl daemon-reload && systemctl restart docker
基础命令
# 查看docker基础信息 docker info # 拉取镜像 docker pull <image>:<tag> # 移除容器 docker rm <containerId> # 移除镜像 docker rmi <imageId> # 启动、停止、重启容器 docker stop <containerId> docker start <containerId> docker restart <containerId> docker run -itd --name <imageName> -P/-p<port>:<port> <imageName> /bin/bash # 查看docker容器 docker ps <-a> # 打包镜像 docker tag <path>/<name> <remotePath>/<name> docker push <remotePath>/<name> # 登录docker docker login <remoteIp> # 进入容器内部 docker exec -it <containerId> /bin/bash # 从仓库搜索镜像 docker search <imageName>
批量操作
# 杀死所有正在运行的容器 docker kill $(docker ps -a -q) # 删除所有的容器 docker rm $(docker ps -a -q) # 删除所有未打 dangling 标签的镜 docker rmi $(docker images -q -f dangling=true) # 删除所有镜像 docker rmi $(docker images -q) docker rmi $(docker images -q) # 强制删除无法删除的镜像 docker rmi -f <imageId> docker rmi -f $(docker images -q)
Dockerfile是一个包含用于组合镜像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取文件中的指令自动生成镜像。
脚本结构
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本镜像,第一条指令必须是FROM。一个声明以#
字符开头则被视为注释。可以在Docker文件中使用RUN
,CMD
,FROM
,EXPOSE
,ENV
等指令。
# 基础镜像 FROM <image> FROM <image>:<tag> FROM <image>@<digest> FROM nginx:latest # 维护者信息 MAINTAINER <author> MAINTAINER tangxbai@hotmail.com # ENV × N ... # 设置镜像环境变量,仅在 Dockerfile 内有效 ENV <key> <value> ENV <key>=<value> ... ENV LANG=C.UTF-8 # ARG × N ... # 用于指定传递给构建运行时的变量 ARG <name>[=<defaultValue>] ARG site ARG argName=defaultArgValue # USER × N ... # 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户 USER <user> USER <user>:<gid> USER <user>:<group> USER <uid> USER <uid>:<gid> USER <uid>:<group> USER root # 用于为镜像添加元数据 LABEL <key>=<value> ... LABEL version="1.0" description="Dockerfile" # ONBUILD × N ... # 当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被触发 ONBUILD [INSTRUCTION] ONBUILD RUN /usr/local/bin/python-build --dir /app/src # RUN × N ... # 构建镜像执行的命令 RUN <command> RUN ["executable", "param1", "param2"] RUN mkdir /path/to/workdir # WORKDIR × N ... # 设置工作目录,类似于cd命令,后续所有操作都会基于此目录进行操作 WORKDIR <path> WORKDIR /path/to/workdir # ADD × N ... # 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget ADD <src>... <dest> ADD ["<src>",... "<dest>"] # 用于支持包含空格的路径 ADD target/project.jar /path/to/workdir # COPY × N ... # 功能类似ADD,但是是不会自动解压文件,也不能访问网络资源 COPY <src>... <dest> COPY ["<src>",... "<dest>"] # 用于支持包含空格的路径 COPY target/project.jar /path/to/workdir # 用于将容器内的目录挂载到宿主机上 # 一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能: # 1、卷可以容器间共享和重用 # 2、容器并不一定要和其它容器共享卷 # 3、修改卷后会立即生效 # 4、对卷的修改不会对镜像产生影响 # 5、卷会一直存在,直到没有任何容器在使用它 VOLUME <path> VOLUME /var/www /var/log/log1 /var/log/log2 # 指定于外界交互的端口 # 注:EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。 EXPOSE <port>/<protocol> ... EXPOSE 80 443 8080 EXPOSE 80/tcp 8080/udp # 配置容器,使其可执行化,配合CMD可省去"application",只使用参数。 # ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。 ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2 ENTRYPOINT java -jar project.jar -Dspring.profiles.active=dev # CMD × N ... # 构建容器后调用,也就是在容器启动时才进行执行 # CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。 CMD <command> CMD ["executable", "param1", "param2"] CMD ["param1","param2"] CMD java -jar project.jar
构建命令
在 Dockerfile文件的存放目录下,执行构建动作。
以下示例,通过目录下的 Dockerfile 构建一个 image:tag(镜像名称:镜像标签)。
docker build -t <image>:<tag> .
docker build -t -f /path/to/a/Dockerfile <image>:<tag> .
docker build:用 Dockerfile 构建镜像的命令关键词。
-t(target):指定镜像名字
-f(file):显示指定构建镜像的 Dockerfile 文件(Dockerfile 可不在当前路径下)
如果不使用 -f,则默认将上下文路径下的名为 Dockerfile 的文件认为是构建镜像的 “Dockerfile”
“.”:当前上下文路径
上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。
如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
最后找了一张很形象的图
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令就可以从 YML 文件配置中创建并启动所有服务。
Compose 使用的三个步骤:
安装插件
# 下载docker-compose插件
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 增加文件可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 创建软连接,以至于可以直接使用在任何目录使用docker-compose命令
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 测试是否安装成功
docker-compose --version
基础命令
docker-compose version
docker-compose -f <path>/<yaml> start
# 显示正在运行的进程
docker-compose top
docker-compose start
docker-compose restart
docker-compose stop
docker-compose up -d
docker-compose down -v
注意:docker-compose.yaml必须和命令在同一目录
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。