潜蛰的博客

潜蛰的个人杂谈
虽山川美景近在眼前,我却只是匆匆过客
  1. 首页
  2. 技术杂谈
  3. 正文

入门docker,一篇文章就够了!!!

2023年 5月 14日 32点热度 1人点赞 1条评论

docker容器技术简介

  1. 什么是docker?

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互隔离,相互之间不会有任何接口。

docker和虚拟机的区别。

技术名称 代表工具 底层的技术实现
虚拟机技术 VMWare、VirtualBox 虚拟机是通过Hypervisor(虚拟机管理系统,常见的有VMWare、
VirtualBox),虚拟出网卡、cpu、内存等虚拟硬件,再在其上建立虚拟机,每个虚拟机是个独立的操作系统,拥有自己的系统内核。
容器技术 Docker 、 k8s 容器是利用namespace(操作系统底层的技术、基于内核层实现的。基于宿主机共享内存的下,它能实现端口、文件隔离。可以理解为允许的容器单独的一个子进程 有docker主进程控制。进程和进程之前是隔离的)将文件系统、进程、网络、设备等资源进行隔离,利用Control
group(linux 控制组内核层实现的一种功能)对权限、cpu资源进行限制,最终让容器之间互不影响,容器无法影响宿主机。

image.png

  • 优点
  • 轻量(容器占用空间小、启动速度快)
  • 可移植性高(容器二次打包)、跨平台(支持主流操作系统)。共享宿主机内存和内核避免了多余的资源消耗。

    docker核心组件

    image.png

Registry-仓库 镜像存放的远程仓库 - 常见的镜像仓库服务是 Docker Hub、当然还有其他的镜像源。
Image-镜像 镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包。负责承载分发和存储。
Container-容器 容器负责运行服务。和虚拟机不同的是,容器内存是共享我们的宿主机内存的。
Client-客户端 客户端 负责和docker daemon进行通信。
daemon-服务器 服务器 Daemon是Docker的守护进程,Docker Client通过命令行与Docker Damon通信,完成Docker相关操作

image.png

  • lxc (linux Container 内核虚拟化技术) 基于于-linux内核 cgroup组【负责系统内核资源管理】 以及 namespace技术【系统内核资源隔离】实现。
  • aufs/btrfs(文件系统)
  • bootfs 包含了bootloader和linux内核
  • debian 通用的liunx发行版
  • container 运行的容器

docker的四种网络模型

Docker网络模式 命令 说明
bridge - (默认该模式) –net=bridge 当docker启动的时候会在该容器网络上创建一个docker0的虚拟网桥(创建虚拟网卡)虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。从docker0子网中分配一个ip给容器使用。并且docker0的ip为容器的默认网关。
host –net=host 容器和宿主机共享Network namespace。
none –net=none 容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口,主机名也是使用宿主机的。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
container –net=container:NAME_or_ID 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。

image.png

docker的基本命令

  • 常用命令
docker search mysql
docker pull mysql:5.7 #从容器源 获取镜像
docker images # 查看本地容器
docker ps -a # 查看本地容器
docker ps # 查看本地已容器
docker exec -it [容器id] /bin/sh # 进入容器
docker export [容器id] > mysql.tar # 导出容器快照
docker import  ubuntu.tar # 导入容器
docker rm [容器id] # 删除容器
docker rmi [容器id] # 删除镜像
docker start [容器id] # 启动容器
docker stop [容器id] # 停止容器
docker restart [容器id] # 重启容器
docker top [容器id] # 类似 linux系统top命令
docker network #容器网络命令
docker network ls # 查看所有的容器网络
docker network inspect [网络id] # 删除容器网络 改命令可以看到该容器网络下面各个容器的ip信息以及该网络分配的号段。
docker network rm [网络id] # 删除容器网络
  • docker run命令构建容器环境。
  • 示例:构建一个php+nginx环境。容器之间可以相互访问对外暴露端口。

    1. 拉取需要的images镜像
    2. 通过 network创建容器网络
    3. 通过run命令进行容器构建 组合多个容器工作到一个docker网络内。

docker pull php:7.1

docker network create --driver bridge --gateway=172.26.1.1 --subnet=172.26.1.0/24 lnmp

docker run  -it --name lnmp_php71 --net=lnmp -h 172.26.1.2 -p 8000:8000 -v D:\www:/www/:rw -d php:7.1

docker pull nginx:1.20.0

docker run  -it -p 80:80 -p 443:443 --net=lnmp 
--link php71 -h  172.26.1.3 --name lnmp_nginx  
-v D:\www\lnmp\nginx\conf.d:/etc/nginx/conf.d/:rw 
-v  D:\www:\www  
-v D:\www\lnmp\nginx\nginx.conf:/etc/nginx/nginx.conf:ro 
-d nginx:1.20.0

docker network inspect lnmp

image.png

  • 问题 当我需要安装php的时候,需要装一些第三方扩展例如:swoole

Dockerfile应用

创建docker镜像一般有三种方式:

  1. 基于已有镜像创建
  2. 基于本地模板创建
  3. 基于Dockerfile创建

Dockerfile基本命令

命令 作用 实例
FROM 基于那个linux发行版或者已有镜像为基础构建 FORM mysql:5.7
ARG 构建参数 构建格式 ARG <参数名>[=<默认值>] build的时候使用 docker run --build-arg=
RUN 构建容器时运行的命令例如:shell: yum install xxx exec:["可执行文件","参数"] RUN yum install xxx
EXPOSE 对外暴露端口 EXPOSE 8000
WORKDIR 容器创建启动后 进入的工作目录 WORKDIR /www
USER 指定该镜像有什么权限去执行 USER root
ENV 运行时环境变量 写入linux /etc/profile 文件 ENV GO_HOME /usr/bin/go
VOLUME 配置容器挂在数据卷(映射宿主机目录)-数据持久化 VOLUME /data/mysqldata
ADD 将目录拷贝进镜像会自动处理url和解压tar包等于copy+解压 ADD swoole.4.8.13.tar
COPY 将原文件从宿主机拷贝到容器内 COPY swoole.4.8.13.tar
CMD 在执行docker run时候执行,可以有多个cmd指令但是只有最后一个生效, docker run的参数会覆盖 cmd的参数,一般可变参数用cmd支持两种格式shell: yum isntall -y vim exec: [“可执行文件”,“参数”] CMD /bin/bash; CMD echo "success"
ENTRYPOINT 也是用来指定容器启动时要执行的命令,类似cmd 但是不会被 run 后的参数命令覆盖,固定参数一般用ENTRY_POINT, 当CMD和ENTRYPOINT联用时,cmd多用于给ENTRYPOINT传参 ENTRYPOINT ["go","build","main.go"]

例子:

FROM debian:bullseye-slim #构建镜像需要一个基础的linux发行版 在这个基础上构建镜像

LABEL maintainer="NGINX Docker Maintainers <docker-maint@nginx.com>" # 作者标签描述 

ENV NGINX_VERSION   1.20.2 # 设置环境变量 
ENV NJS_VERSION     0.7.0
ENV PKG_RELEASE     1~bullseye

RUN chmod +x install.sh

COPY docker-entrypoint.sh /

ENTRYPOINT ["/docker-entrypoint.sh"] #

EXPOSE 80

#STOPSIGNAL SIGQUIT # 发送系统退出信号

CMD ["nginx", "-g", "daemon off;"] # 执行命令 nginx -g "daemon off;" 启动容器后台运行

容器编排工具- docker-compose

docker-compose是docker官方的开源项目。是一个容器集群的编排工具。通过编写docker-compose.yml文件可以编排多个容器构成一个有依赖关系的服务。

docker-compose.yml 简单示例

version: "3.5"
services:
  nginx:

    build:
       #context: ./services/nginx
      # image:'nginx:1.6'
      #args:
      #  NGINX_VERSION: nginx:${NGINX_VERSION}
    container_name: nginx
    ports:
      - "${NGINX_HTTP_HOST_PORT}:80"
    volumes:
      - D\git\3d66\:/www/:rw
    # 网络
    networks:
      #网络名称
      3d66_service:
        ipv4_address: 172.28.1.2

常用命令

  • 注意 docker-compose 命令必须依赖 docker-composer.yml文件同级执行。不然会报错。
#docker-compose 
docker-compose -d build #构建构建所有容器
docker-compose -d build php71 #构建php71 这个容器
docker-compose -d --no-cache build  php71 # --no-cache 不走缓存重新构建
docker-compose up -d # 构建并启动容器 和 build 同理 可以根据容器名进行启动

-d:在后台运行服务容器;
–no-color:不使用颜色来区分不同的服务的控制台输出;
–no-deps:不启动服务所链接的容器;
–force-recreate:强制重新创建容器,不能与 --no-recreate 同时使用;
–no-recreate:如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用;
–no-build:不自动构建缺失的服务镜像;

docker-compose exec php71 bash # 进入容器
docker-compose restart  # 重启容器  和build 同理 可以根据容器名进行启动
docker-compose pull  # 拉取
docker-compose image  # 查看当前服务所有镜像
docker-compose ps  # 查看当前服务运行的容器
docker-compose ps -a  # 查看当前服务已构建的容器
docker-compose run -a  # 指定服务运行命令
docker compose kill # 杀死并删除当前正在运行的容器。
docker compose logs # 查看容器运行日志
docker compose rm xxx #删除所有停止状态的服务容器
docker compose top  #类似linux top
  • 其他命令可以自己看 docker-compose --help

标签: docker docker-compose dockerfile 容器技术 虚拟机
最后更新:2023年 5月 14日

latent

这个人很懒,什么都没留下

打赏 点赞
< 上一篇

文章评论

  • latent

    :smile:

    2023年 5月 14日
    回复
  • 取消回复

    COPYRIGHT © 2023 pltrue.top. ALL RIGHTS RESERVED.

    THEME KRATOS MADE BY VTROIS

    赣ICP备19000975号