导图社区 Docker核心知识
docker常用命令及核心概念,Docker是一个开源的容器化平台,它可以让开发者将应用程序及其依赖打包成一个独立的容器,从而实现跨平台、可移植的部署。
编辑于2024-01-04 11:02:52Docker核心知识
初始docker
docker 概念
安装docker
1、yum 包更新到最新
yum update
2、安装需要的软件包, yum-util 提供yum-config-manager功能 ,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
3.设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
4、 安装docker,出现输入的界面都按 y
yum install -y docker-ce
5、 查看docker版本,验证是否验证成功
docker -v
docker架构
配置docker加速镜像
docker命令
进程相关命令
启动docker服务
systemctl start docker
停止docker服务
systemctl stop docker
重启docker服务
systemctl restart docker
查看docker服务状态
systemctl status docker
开机启动docker服务
systemctl enable docker
镜像相关命令
查看镜像
docker images
搜索镜像
docker search 镜像名称
拉取镜像
docker pull
删除本地镜像
删除指定本地镜像
docker rmi 镜像id
删除所有本地镜像
docker rmi `docker images -q`
容器相关命令
查看容器
查看正在运行的容器
docker ps
查看所有容器,包括正在运行和停止的容器
docker ps –a
创建并启动容器
docker run 参数
• -i:保持容器运行。通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。 • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用。 • -d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。 • -it 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器 • --name:为创建的容器命名。
**1)交互式容器**
以**交互式**方式创建并启动容器,启动完成后,直接进入当前容器。使用exit命令退出容器。需要注意的是以此种方式 启动容器,如果退出容器,则容器会进入**停止**状态。
docker pull centos:7
docker run -it --name=mycentos7 centos:7 /bin/bash
**2)守护式容器**
创建一个守护式容器;如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。命令如下(容器名称 不能重复):
docker run -di --name=mycentos2 centos:7
docker exec -it mycentos2 /bin/bash
进入容器
docker exec -it mycentos2 /bin/bash
停止容器
docker stop 容器名称或者容器id
启动容器
docker start 容器名称或者容器id
删除容器
删除指定容器
docker rm 容器名称或者容器id
删除所有容器
docker rm `docker ps -a -q`
查看容器信息
docker inspect 容器名称或者容器id
设置容器自动启动/不启动
docker container update --restart=always/no
查看容器内程序的日志
docker logs -f rmqbroker
docker容器的数据卷
数据卷概念
什么是数据卷
就是用来保存数据的文件 有什么用: 1.在多个容器之间共享数据,多个容器可以同时以只读或者读写的方式挂载统一个数据卷,从而共享数据卷中的数据 2.当宿主机不能保证一定存在某一个目录或一些固定的文件路径时,使用数据卷可以规避这种限制带来的问题 3.当想把容器中的数据存储在宿主机之外的地方时,比如远程主机上和云存储上
数据卷的使用
将Docker数据挂载到容器
在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中。目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中 
volumes
Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式)
bind mounts
意为着可以存储在宿主机系统的任意位置;(比较常用的方式)
tmpfs
挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;(一般都不会用的方式)
Volume的基本使用
管理卷
# docker volume create edc-nginx-vol // 创建一个自定义容器卷 # docker volume ls // 查看所有容器卷 # docker volume inspect edc-nginx-vol // 查看指定容器卷详情信息
创建使用指定卷的容器
有了自定义容器卷,我们可以创建一个使用这个数据卷的容器,这里我们以nginx为例: # docker run -d -it --name=edc-nginx -p 8800:80 -v edc-nginx-vol:/usr/share/nginx/html nginx 其中,-v代表挂载数据卷,这里使用自定数据卷edc-nginx-vol,并且将数据卷挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。 如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载。
清理卷
如果不再使用自定义数据卷了,那么可以手动清理掉: # docker stop edc-nginx // 暂停容器实例 # docker rm edc-nginx // 移除容器实例 # docker volume rm edc-nginx-vol // 删除自定义数据卷
Bind Mounts的基本使用
使用卷创建一个容器
docker run -d -it --name=edc-nginx -v /app/wwwroot:/usr/share/nginx/html nginx 这里指定了将宿主机上的 /app/wwwroot 目录(如果没有会自动创建)挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。 与volumes不同,bind mounts的方式会隐藏掉被挂载目录里面的内容(如果非空的话),这里是/usr/share/nginx/html 目录下的内容被隐藏掉了,因此我们看不到。
验证绑定
docker stop edc-nginx docker rm edc-nginx 同volumes一样,当我们清理掉容器之后,挂载目录里面的文件仍然还在,不会随着容器的结束而消失,从而实现数据持久化。
清理
应用案例
在服务治理组件中,服务发现组件是一个最常用的组件之一,Consul是一个流行的服务发现开源项目,Consul推荐我们使用配置文件的方式注册服务信息。因此,我们常常会将填写好服务注册配置文件放在宿主机的一个文件目录下将其挂载到Consul的容器指定目录下,如下所示: docker run -d -p 8500:8500 --restart=always \ -v /XiLife/consul/data/server1:/consul/data -v /XiLife/consul/conf/server1:/consul/config \ -e CONSUL_BIND_INTERFACE='eth0' --privileged=true \ --name=consul_server_1 consul:1.4.4 agent -server -bootstrap-expect=3 -ui -node=consul_server_1 -client='0.0.0.0' \ -data-dir /consul/data -config-dir /consul/config -datacenter=xdp_dc;
Docker网络
1、bridge网络
2、none网络模式
3、host网络模式
4、container 模式
Dockerfile
什么是 Dockerfile?
ockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。 docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。 例:docker build -f /path/to/a/Dockerfile
Dockerfile的基本结构
基础镜像信息
维护者信息
镜像操作指令
容器启动时执行指令
Dockerfile文件说明
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。
docker指令
FROM
格式: FROM <image> FROM <image>:<tag> FROM <image>@<digest>示例: FROM mysql:5.6 注: tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
指定基础镜像,必须为第一个命令
MAINTAINER
格式: MAINTAINER <name> 示例: MAINTAINER Jasper Xu MAINTAINER sorex@163.com MAINTAINER Jasper Xu <sorex@163.com>
维护者信息
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
构建镜像时执行的命令
ADD
格式: 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/
将本地文件添加到容器中
tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
COPY
功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
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用于指定镜像构建时所要执行的命令。
构建容器后调用,也就是在容器启动时才进行调用
ENTRYPOINT
格式: ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先) ENTRYPOINT command param1 param2 (shell内部命令) 示例: FROM ubuntu ENTRYPOINT ["top", "-b"] CMD ["-c"]注: ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
配置容器,使其可执行化
配合CMD可省去"application",只使用参数。
LABEL
用于为镜像添加元数据
ENV
EXPOSE
VOLUME
WORKDIR
USER
ARG
ONBUILD
DockerCompose详解
Docker底层相关
Docker安全相关
docker 实例
https://www.exception.site/docker/docker-install-mysql
redis
docker run -d --name redis -p 6379:6379 redis --requirepass hujie823975302
elasticSearch
docker pull elasticsearch:7.8.0 docker run -d \ --name es \ -p 9200:9200 -p 9300:9300 \ -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms200m -Xmx200m" \ elasticsearch:7.8.0
如何编写Dockerfile