docker容器技术简介
- 什么是docker?
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互隔离,相互之间不会有任何接口。
docker和虚拟机的区别。
技术名称 | 代表工具 | 底层的技术实现 |
---|---|---|
虚拟机技术 | VMWare 、VirtualBox |
虚拟机是通过Hypervisor (虚拟机管理系统,常见的有VMWare 、VirtualBox ),虚拟出网卡、cpu、内存等虚拟硬件,再在其上建立虚拟机,每个虚拟机是个独立的操作系统,拥有自己的系统内核。 |
容器技术 | Docker 、 k8s |
容器是利用namespace (操作系统底层的技术、基于内核层实现的。基于宿主机共享内存的下,它能实现端口、文件隔离。可以理解为允许的容器单独的一个子进程 有docker主进程控制。进程和进程之前是隔离的)将文件系统、进程、网络、设备等资源进行隔离,利用Control group (linux 控制组内核层实现的一种功能)对权限、cpu资源进行限制,最终让容器之间互不影响,容器无法影响宿主机。 |
Registry-仓库 | 镜像存放的远程仓库 - 常见的镜像仓库服务是 Docker Hub、当然还有其他的镜像源。 |
---|---|
Image-镜像 | 镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包。负责承载分发和存储。 |
Container-容器 | 容器负责运行服务。和虚拟机不同的是,容器内存是共享我们的宿主机内存的。 |
Client-客户端 | 客户端 负责和docker daemon进行通信。 |
daemon-服务器 | 服务器 Daemon是Docker的守护进程,Docker Client通过命令行与Docker Damon通信,完成Docker相关操作 |
- 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。 |
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环境。容器之间可以相互访问对外暴露端口。
- 拉取需要的images镜像
- 通过
network
创建容器网络 - 通过
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
- 问题 当我需要安装php的时候,需要装一些第三方扩展例如:swoole
Dockerfile应用
创建docker镜像一般有三种方式:
- 基于已有镜像创建
- 基于本地模板创建
- 基于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
文章评论