淘先锋技术网

首页 1 2 3 4 5 6 7

一、Docker镜像和容器

①、镜像命令

Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。

镜像下载(pull)

docker pull 镜像名字:[版本]
  • 注意:
    如果不指定tag,则下载Docker Hub公共注册服务器中仓库的最新版本。

查看镜像(images)

docker images

镜像搜索(search)

docker search [镜像名字]:[版本]

删除镜像(rmi)

docker rmi 源名字
docker rmi image id

②、容器命令

新建并启动容器(run)

  • 守护态运行
docker run -d 镜像名字 
  • 创建容器(create)
docker create -it 镜像名字
  • 创建运行容器
docker run 镜像名字 /bin/echo 
  • 参数:
    • -t 选项让Docker 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,
    • -i 则让容器的标准输入保持打开。
    • -p 我们以后使用3307 端口来访问mysql 为了防止黑客攻击
    • -e 配置环境变量 MYSQL_ROOT_PASSWORD 设置容器内mysql root 密码

列出容器(ps)

docker ps
  • 参数:
    • -a: 显示未启动容器
    • -q:返回容器id号

终止容器(stop)

docker stop 容器id

重新启动(restart)

  • 启动
docker start 容器id
  • 重新启动
docker restart 容器id

进入容器(exec)

docker exec -it 容器id /bin/bash
  • 进入容器(attach)
docker attach 容器id

删除容器(rm)

docker rm 容器id
  • 参数:
    • -f, --force=false强行终止并删除一个运行中的容器。
    • -l, --link=false删除容器的连接,但保留容器。
    • -V,–volumes=false删除容器挂载的数据卷。

从容器拷贝文件到主机上

docker cp 容器id:容器内路径   目录路径

退出

  • 直接停止同期并退出
exit  
  • 容器不停止 并退出
Ctrt + p + q

查看日志

docker logs 容器id
  • 参数:
    • -f, --follow 跟踪实时日志
    • –since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
    • –tail string 从日志末尾显示多少行日志, 默认是all
    • -t, --timestamps 显示时间戳
    • –until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)

③、查看容器里面的进程

docker top 容器id

二、Docker容器数据卷

①、配置数据卷

docker run -v 宿主机目录(文件):容器内目录(文件) 
  • 注意事项
    • 目录必须是绝对路径
    • 如果目录不存在则会自动创建
    • 可以挂载多个数据卷

②、数据卷容器

docker volume 参数
  • 参数:
    • create # 创建数据卷
      inspect # 查看数据卷元数据
      ls # 查看数据卷列表
      prune # 删除所有未使用的卷
      rm # 删除数据卷

●创建一个自定义容器

docker volume create 容器卷-名

●●查看所有容器卷

docker volume ls

●●●查看指定容器卷详情信息

docker volume inspect 容器卷-名

●●●●删除数据卷

docker volume rm 容器卷-名

使用指定卷容器

有了自定义容器卷,我们可以创建一个使用这个数据卷的容器,这里我们以tomcat为例:

docker run -d -it --name=edc-tomcat -p 8080:8080 -v 容器卷-名:/usr/local/tomcat/webapps tomcat

-v代表挂载数据卷,这里使用自定数据卷edc-tomcat-vol,并且将数据卷挂载到/usr/local/tomcat/webapps 。如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载。

三、DockerFile

  • 基本结构

Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。一般而言,Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-44NuK8IW-1673922371733)(C:/Users/Administrator/Desktop/%E6%96%87%E6%A1%A3%E6%9F%A5%E6%89%BE/Markdown/Markdown/images/03.docker/DockerFile.png)]

①、入门镜像

  • Dockerfile 四部分说明:
    • 一开始必须要指明所基于的镜像名称, 关键字是FROM, 这是必须的.
    • 接下来是维护者信息关键字是MAINTAINER, 非必须, 但良好的习惯有利于后期的职责明确.
    • 后面是镜像操作指令, 如RUN等, 每执行一条RUN命令,镜像添加新的一层.
    • 最后是CMD指令,来指明运行容器时的操作命令

●构建镜像文件

在一个空白的文本文件, 命名为Dockerfile

vim Dockerfile

●●构建镜像

. 镜像文件目录执行

docker build -t 镜像名字:版本 .

②、基础命令

FROM —— 指定基础镜像

指定基础镜像,必须为第一个命令。

FROM <image>:<tag> 
  • 注意:
    • tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

MAINTAINER —— 维护者信息

维护者信息

MAINTAINER <name>

WORKDIR —— 类似于cd命令

工作目录,类似于cd命令

WORKDIR /usr/workdir
  • 注意:
    • 通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

③、构建命令

RUN —— 执行命令

构建镜像时执行的命令

# 1. shell执行格式 
RUN <命令>

# 2. exec执行格式 
RUN ["executable", "param1", "param2"]
  • 注意:
    • RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定–no-cache参数,如:docker build --no-cache

ADD —— 添加本地文件

将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。

ADD <本地文件>... <放置文件镜像目录>    

ADD ["<src>",... "<dest>"] 用于支持包含空格的路径示例:

COPY—— 类似ADD

功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。

COPY <源路径> <目标路径> 

CMD —— RUN指令相似

  • 构建容器后调用,也就是在容器启动时才进行调用。指定这个容器启动的时候要运行的命令只有最后一个会生效可被替换。
  • CMD指令与RUN指令相似
# shell格式
CMD <命令>

# exec格式
CMD ["可执行文件", "参数1", "参数2", …]

④、配置命令

ENTRYPOINT —— RUN指令相似

配置容器,使其可执行化。配合CMD可省去"application",只使用参数。

指定容器启动的要运行的命令,可以追加命令

ENTRYPOINT ["executable", "param1", "param2"]

ENTRYPOINT command param1 param2 (shell内部命令) 
  • 注意:
    • ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。

ENV —— 设置环境变量

这个指令非常简单,就是用于设置环境变量而已,无论是接下来的指令,还是在容器中运行的程序,都可以使用这里定义的环境变量。

ENV JAVA_HOME=/usr/local/jdk1.7.0_79
ENV PATH=$JAVA_HOME/bin:$PATH
ENV <key>=<value>

EXPOSE —— 设置端口

指定于外界交互的端口

EXPOSE <port>
  • 注意:
    • EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口

VOLUME —— 数据卷

用于指定持久化目录

VOLUME ["/path/to/dir"]
  • 注意:
    • 一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
      • 卷可以容器间共享和重用
      • 容器并不一定要和其它容器共享卷
      • 修改卷后会立即生效
      • 对卷的修改不会对镜像产生影响
      • 卷会一直存在,直到没有任何容器在使用它

USER —— 运行权限

USER 指令用于将会用以什么样的用户去运行

USER userUSER:group
  • 注意:
    • 使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过 docker run运行容器时,可以通过-u参数来覆盖所指定的用户。

ONBUILD —— 基座

帮助别人定制而准备的

ONBUILD [INSTRUCTION]

⑤、RUN、CMD、ENTRYPOINT区别

  • 区别:
  1. RUN:执行命令并创建新的Image
  2. CMD: 设置容器启动后默认执行的命令和参数
  3. ENTRYPOINT:设置容器启动时运行的命令
  • CMD #指定这个容器启动的时候要运行的命令,可被替换
  • ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令

⑥、自定义tomcat镜像

编写dockerfile 文件

#基础镜像
FROM java:8

#维护者
MAINTAINER itxiong<[email protected]>

#拷贝tomcat包
ADD ./apache-tomcat-9.0.50.tar.gz /usr/local

#设置工作目录
WORKDIR /usr/local

#设置tomcat环境变量
ENV TOMCAT_HOME=/usr/local/apache-tomcat-9.0.50
ENV PATH=$PATH:$TOMCAT_HOME/bin

#保留端口
EXPOSE 8080

#启动容器运行命令
CMD startup.sh && tail -F catatlina.out

docker build构建

docker build -t 镜像名字:版本 .

docker run运行

docker run xxx

四、Docker网络管理

①、evth-pair技术

evth-pair 就是一对的虚拟设备接口,它们都是成对出现,一段彼此连接。 正是因为这个特性,evth-parit桥梁。 连接各种各样网络设备。

②、容器互联

--link <name or id>:alias
  • 参数:

    • name和id是源容器的name和id,alias是源容器在link下的别名。
  • docker run --name tomcat01 --link tomcat02 -d -P tomcat

③、四种网络模式

  • Host模式

如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个NetworkNamespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

  • Container模式

这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。

  • None模式

这种网络模式下容器只有io回环网络,没有其他网卡。none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

  • Bridge模式

bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。

①、自定义网络

  • 基础命令
docker network --help
命令名称说明
docker network connect将容器连接到网络
docker network create创建一个网络
docker network disconnect断开容器的网络
docker network inspect显示一个或多个网络的详细信息
docker network ls列出网络
docker network prune删除所有未使用的网络
docker network rm删除一个或多个网络

●创建局域网络

docker network create --driver 桥接方式 --subnet 网段范围 --gateway 路由 网络名
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
- 注意:
  - --driver:网络模式。bridge -网络模式桥连接
  - --subnet:网段范围。
    - 192.168.200.0/24命令指定该网络模式网段范围,其中24代表该网段前24位相同,后8位不同,即该网段范围为:192.168.200.1~192.168.200.254,
    - 若该命令改为192.168.200.0/16,即该网段范围为: 192.168.0.1-192.168.255.254,这个范围就变的很大了。
  - gateway - 路由
  - mynet- 自定义网络名

●●容器连接新网络

将容器连接到新建网络

docker network connect 网络名 容器名

●●●查看容器网络情况

docker network inspect 容器名

★★★指定网络模式

docker run创建Docker容器时,可以用 --net 选项指定容器的网络模式

docker run -d -P --name tomcat01 --net mynet tomcat:test3
docker run -d -P --name tomcat02 --net mynet tomcat:test3
docker exec -it tomcat01 ping tomcat02
# 查看自定义网络信息
docker network inspect mynet
host模式:使用 --net=host 指定。
none模式:使用 --net=none 指定。
bridge模式:使用 --net=bridge 指定,默认设置。
container模式:使用 --net=container:NAME_or_ID指定

五、Docker镜像管理

官方DockerHub :https://hub.docker.com/signup

①、DockerHub 基本命令

  • 连接
docker login --username=kalista
  • 注意:
    • 填写注册Docker Hub的密码。
  • 把容器提交到docker hub上
docker commit -m "镜像描述" -a "作者" 容器id/容器名字 远程库的名字:上传到dockerhub上的名字
  • 注意:
    • -m 镜像描述
    • -a 作者
  • 将镜像,容器,远程库进行标识
docker tag 镜像id 远程库的名字:上传到dockerhub上的名字
  • 将于远程库有标识关系的库提交
docker push 远程库的名字:上传到dockerhub上的名字