1. 什么是Docker
Docker是基于Go语言实现的开源容器引擎,诞生于2013年年初,用于将应用程序及其依赖项打包为容器,以便在云或本地环境中自动部署和运行。Docker通过操作系统层面的虚拟化技术,将软件与其依赖项隔离,确保应用程序能够在不同的环境中一致地运行。
Docker的特点
-
容器化:Docker容器是一个轻量级的、可执行的独立软件包,包含应用程序运行所需的所有内容,如代码、运行时环境、系统工具、系统库和设置。这些容器可以在任何环境中一致地运行,不受外在环境差异的影响。
-
隔离性:Docker容器通过Linux内核的cgroup和namespace等技术实现进程隔离,确保应用程序在独立的容器中运行,互不干扰。
-
跨平台:Docker容器可以在Windows、macOS和Linux上运行,支持x86-64、ARM、s390x和ppc64le等多种架构。
Docker的优势:
-
速度快:Docker容器很快,启动和停止可以在秒级实现
-
占用资源少: 容器对系统资源需求很少,一台主机可以同时运行数千个Docker容器
-
操作便捷: 通过类似Git设计理念的操作来方便用户操作镜像
-
Dockerfile: Dockerfile支持灵活的自动化创建和部署机制
2. Docker组件基本概念
- Image(镜像)
镜像是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。 在 Dockerfile 中, 每一条指令都会创建一个镜像层,继而会增加整体镜像的大小。
例如:一个镜像可以包含一个基本的操作系统环境,里面仅安装了tomcat等,可以把他看做一个tomcat镜像
镜像是创建Docekr容器的基础,通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的景象,用户可以直接从网上下载一个已经做好的应用镜像,并直接使用
- Container(容器)
Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用,容器是从镜像创建的应用运行实例(一个镜像可以运行n个实例,即n个容器),他可以启动,开始,停止,删除,每个容器都是彼此隔离,不可见的,可以把容器看做一个简易版的linux系统环境以及运行在其中的应用程序打包而成的盒子
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
- Registry(仓库)
Docker仓库类似于代码仓库,是集中存放镜像文件的地方,一个 Docker Registry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过<仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
目前最大的公开仓库是Docker Hub,其中存放着庞大的镜像提供给用户下载,docker也支持用户在本地网络内创建私有仓库
3. 安装与运行
安装:yum install docker-ce
查看: docker version
设置阿里云加速:
mkdir -p /etc/docker
vim /etc/docker/daemon.json
添加:
{
"registry-mirrors": ["https://j2gvd296.mirror.aliyuncs.com"]
}
启停:
systemctl start docker
systemctl stop docker
4. 镜像操作
1. 下载
docker hub可以去查看具体版本
https://hub.docker.com/r/library/
docker pull NAME:TAG (TAG可以写成latest,获取最新版本)
2. 查看
docker images 查看所有下载的镜像
docker tar centos:7 mycentos:7 给镜像添加自定义标签,类似软链接
docker inspect centos:7 查看详细信息,返回json格式数据
docker history centos:7 查看该镜像创建历史
docker rmi mycentos:1(也可根据id删除) 删除镜像, -f 强制删除 ,如果是自定义标签,只会删除标签的副本,原来的还在
docker search 搜索镜像:
--limit int 显示个数,默认25个
--no-trunc 不截断输出结果
--filter filter 使用过滤器
3. 创建
- 基于已有的容器创建
docker commit -m "add my file" -a "houzheng" ob97c97 test:0.1
-m 提交信息 -a 作者信息 之前运行的改变的容器id 仓库:版本
- 基于Dockerfile创建
4. 保存和导入
docker save -o centos:7.tar centos:7 保存到本地
docker load -i centos:7.tar 从本地导入镜像
5. 上传
docker push docker用户名/仓库名:tag
例如:
docker push houzheng/helloworld:1
5. 容器操作
1. 创建
docker create -it --name=mydock centos:7
i:保持打开容器的标准输入
t:告诉docker为容器建立一个命令行终端。
name:指定容器名称,可以不填(随机)
默认不会启动,不加it容器启动会退出
docker run -it -d centos:7 创建并启动
-d 在后台运行,如果有 /bin/bash 不加d直接进入容器
-c "while true; do echo hello;" 后面执行命令
2. 查看
docker ps -a 查看所有容器,包括停止的
docker ps 查看运行的容器
docker ps -l :查看最新创建的容器,只列出最后创建的
docker ps -n=2 -n=x选项会列出最后创建的x个容器
查看容器详情: docker container inspect bb5fce124c49
查看容器内进程: docker top bb5fce124c49
查看容器详情:显示CPU,网络情况等 不持续 不截断输出 docker stats --no-stream --no-trunc bb5fce124c49
3. 启动进入
docker start id 启动
docker restart name/ID 重启容器
docker attach name/ID 进入容器
docker exec -it bb5fce124c49 /bin/bash 进入容器(如果是redis就 redis-cli这种类似)
4. 终止
docker stop name/id :将容器退出。
docker kill name/id:强制停止一个容器
docker stop $(docker ps -aq) 停止所有容器
docker pause 暂停
docker unpause 恢复
5. 删除
docker rm name/id:不能够删除一个正在运行的容器,会报错。需要先停止容器
docker rm $(docker ps -aq):-a标志列出所有容器,-q标志只列出容器的ID,然后传递给rm命令,依次删除容器
6. 导入导出
docker export id > name.tar
docker import name.tar - imcentos:0.1 导入变成镜像
7. 其他命令
docker cp -a zookeeper.out bb5fce124c49:/ 将文件复制到容器根目录下,-a 复制gid和UID信息 -L 复制软连接的目标内容
docker port bb5fce124c49: 查看端口映射
docker diff bb5fce124c49: 查看容器文件变更
8. 查看日志
docker logs -f name : 查看实时日志
6. 数据管理
1. 数据卷
数据卷是一个可供容器使用的特殊目录,他将主机操作系统目录直接映射进容器,类似于Linux中的mount行为,是用来持久化数据的一种机制。数据卷可以在容器之间共享,也可以从一个容器备份到另一个容器。
特点:
-
可以在容器之间共享和重用,容器间传递数据将变得高效和方便
-
数据修改会立马生效
-
对数据卷的更新不会影响镜像
-
数据卷会一直存在,直到没有容器使用,才可以安全卸载
创建的文件或者目录在 /var/lib/docker/volumes/里面
例如: 挂载主机/root/shell目录到 容器/opt/shell
docker run -it --mount type=bind,source=/root/shell,destination=/opt/shell --name=hehe centos:7
2. 数据卷容器
如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载
创建数据卷容器:
docker run -it -v /dbdata --name dbdata ubuntu
其他容器用--volumes-from来挂载dbdata容器中的数据卷:
docker run -it --volumes-from dbdata --name db1 ubuntu
docker run -it --volumes-from dbdata --name db2 ubuntu
此时,容器db1和db2都挂载同一个数据卷到相同的/dbdata目录。三个容器任何一方在该目录下的写入,其他容器都可以看到
7. 端口映射
docker run -itd -p 8009:8888 --name=houzh centos:7
-p 指定端口映射
-P 随机分配一个宿主机49000-49900的端口映射到容器内端口
docker run -it -p 192.168.171.128::5000 使用IP::端口映射任意端口到容器,本地主机会自动分配
8. 容器互联
docker run -itd --name=web --link db:webdb centos:7
使用 --link 连接db容器,webdb别名
9. Dockerfile
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本
构建三步骤:
-
编写Dockfile文件
-
构建 docker build
-
运行 docker run
Dockerfile内容基础知识
-
每条保留字指令都必须为大写字母且后面要跟随至少一个参数
比如 From xxx 如果这个xxx啥都不写就会报错 -
指令按照从上到下,顺序执行
-
#表示注释
-
每条指令都会创建一个新得镜像层,并对镜像进行提交
Dockerfile关键字:
- From 基础镜像,当前新镜像是基于哪个镜像的
Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的
-
MAINTAINER 镜像维护者的姓名和邮箱地址
-
run 容器构建时需要额外运行的命令
ps:相当于一串逻辑代码中加sout输出一句话在控制台,也就是需要执行
-
expose 当前容器对外暴露的端口
-
workdir 终端登录落脚点,指定在创建容器后,终端登录进去的默认目录,也就是一个落脚点
-
env 用来在构建镜像过程中设置环境变量ps: env my_path /usr/mytest
-
add 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理url和解压tar压缩包
-
copy 类似ADD,拷贝文件和目录到镜像中,对比 add 它就是只负责拷贝,不解压
-
volume 容器数据卷,用于数据保存和持久化工作
-
cmd 指定一个容器启动时要运行的命令
dockfile中可以有多个cmd指令,但只有最后一个生效,cmd会被docker run 之后的参数替换
- entrypoint 指一个容器启动时要运行的命令,entypoint的适合cmd一样,都是在指定容器启动程序及参数;
经典考题:
cmd和entrypoint有啥区别?
cmd允许写多个,多个cmd以最后一个为准,其他虽然会执行但是不生效
entrypoint则是追加的形式
- onbuild 当构建一个被继承的dockerfile时运行,父镜像在被子镜像继承父镜像的onbuild被触发 类似于触发器
先写一个父镜像
再写一个子镜像,继承父镜像,当构建的子镜像的时候,就会触发父镜像的onbuild
- label 标签 也就是说明的意思
比如,自定义一个Dockerfile:
From centos
#作者以及邮箱
MAINTAINER wang<15727538286@163.com>
#把宿主机当前上下文的c.txt拷贝到容器 /usr/local
COPY C.txt /usr/local/cc.txt
#把java与tomcat添加到容器中
ADD jdk-8u181-linux-x64.tar.gz /usr/local
ADD apache-tomcat-8.5.27.tar.gz /usr/local
#安装vim编辑器
RUN yum -y install vim
#设置工作访问的适合workdir路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_181
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.27
ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.27
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
#ENTRYPOINT["/usr/local/apache-tomcat-8.5.27/bin/startup.sh"]
# CMD ["/usr/local/apache-tomcat-8.5.27/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-8.5.27/bin/startup.sh&&tail -F /usr/local/apache-tomcat-8.5.27/bin/logs/catalina.out
docker build:
Docker build命令的基本语法如下:
docker build [OPTIONS] PATH | URL | -
其中,OPTIONS表示命令选项,PATH | URL | -表示Dockerfile的路径或URL,也可以是标准输入(-)。
二、常用的Docker Build命令选项
-
—build-arg:设置构建时的变量。这个选项允许我们在构建过程中传递一些参数或变量,以便在Dockerfile中使用。
-
—no-cache:不使用Build Cache构建镜像。默认情况下,Docker会使用缓存来加速镜像的构建过程。但是,在某些情况下,我们可能希望禁用缓存,以确保每次构建都是最新的。
-
—pull:使用gzip压缩构建的上下文。这个选项可以让我们在构建镜像时,将上下文进行gzip压缩,以减少传输的数据量。
-
—file, -f:指定Dockerfile的路径。默认情况下,Docker会在当前目录下查找名为Dockerfile的文件。但是,如果我们的Dockerfile不在当前目录下,或者我们想要使用不同的文件名,就可以通过这个选项来指定。
-
—label:为生成的镜像设置metadata。这个选项允许我们在构建镜像时,为镜像添加一些标签(label),以便在后续的管理和查找中更加方便。
三、Docker Build命令的使用示例
假设我们有一个名为myapp的应用程序,它的Dockerfile位于当前目录下的myapp/目录下。我们可以使用以下命令来构建该应用程序的Docker镜像:
docker build
-``t myapp``:``latest
-``f myapp``/``Dockerfile
.
这个命令告诉Docker,我们要根据myapp/目录下的Dockerfile来构建一个名为myapp:latest的镜像。其中,-t选项用于指定镜像的名字和标签,-f选项用于指定Dockerfile的路径,最后的.表示Dockerfile所在的上下文路径。
10. helloworld之redis
下载镜像:docker pull redis:5.0.5
创建容器:docker run -itd -p 6379:6379 --name=myredis redis:5.0.5
使用数据卷映射配置文件:
docker run -p 6378:6379 --name redis01 -v 本机配置文件/redis.conf:/etc/redis/redis.conf -v 本机数据备份目录/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
进入redis: docker exec -it f7c901e37252 redis-cli
11. docker compose
Compose 是用于定义和运行多容器Docker应用程序的编排工具。通过 Compose可以轻松、高效的管理容器,您可以使用 YML 文件来配置应用程序需要的所有服务。然后使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
Compose创建的容器是基于Docker的,所以可以使用Docker进行管理,但是推荐使用声明式管理方式,也就是通过修改配置文件来管理。
使用Docker Compose
启动项目:
docker-compose up -d
查看运行中的服务:
docker-compose ps
停止和删除容器、网络:
docker-compose down
Docker-compose.yml配置详解
(1)顶级配置项
-
version 定义了版本信息
-
services 定义了服务的配置信息
-
networks 定义了网络信息,提供给 services 中的 具体容器使用
-
volumes 定义了卷信息,提供给 services 中的具体容器使用
格式:
version: "3.8" #这边的版本yml文件的版本号
services: # 容器
servicename: # 服务名字,这个名字也是内部 bridge网络可以使用的 DNS name
image: # 镜像的名字
command: # 可选,如果设置,则会覆盖默认镜像里的 CMD命令
environment: # 可选,相当于 docker run里的 --env
volumes: # 可选,相当于docker run里的 -v
networks: # 可选,相当于 docker run里的 --network
ports: # 可选,相当于 docker run里的 -p
servicename2:
volumes: # 可选,相当于 docker volume create
networks: # 可选,相当于 docker network create
yaml基础知识:
-
大小写敏感,缩进表示层级关系
-
缩进空格数不重要,相同层级左侧对齐即可。(不允许使用 tab 缩进!)
-
由冒号分隔的键值对表示对象;一组连词线开头的行,构成一个数组;字符串默认不使用引号
(2)version配置指令
(3)networks配置指令
未显示声明网络,容器会被加入app_default网络中。配置自定义网络
version: '3'
services:
proxy:
build: ./proxy
networks:
- front
db:
image: postgres
networks:
- back
networks:
front:
driver: host
back:
driver: bridge
配置默认网络
version: '3'
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
networks:
default:
driver: overlay
使用已存在的网络
version: '3'
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
networks:
default:
external:
name: my-pre-existing-network
(4)volumes配置指令
自定义卷供容器挂载使用
version: '3'
services:
db:
volumes:
- db_data:/var/lib/mysql
wordpress:
volumes:
- wordpress_files:/var/www/html
volumes:
wordpress_files:
db_data:
标签:容器,name,--,笔记,4.36,镜像,docker,Docker
From: https://www.cnblogs.com/houzheng/p/18639541