docker学习笔记
1.什么是docker?
1.docker是一种基于容器的虚拟化技术,可以让开发者将开发的软件以及依赖打包成一个镜像然后发布到任何流行的linux或windows服务器上面,并且跟重要的是,在实际的生产环境中,开发和运维的环境往往会不相同,经常可能导致开发在开发的环境下可以运行但是迁移到运维的机器上就运行不了,docker的出现解决了这些环境不一致性的问题。
2.为什么要用docker?
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
3.docker架构
1.docker三个概念
2.docker体系结构
docker采用C/S结构,docker daemon作为server接收client的请求,client和server可以运行在同一台机器上,也可以使用socket通信的方式运行在不同的机器上面
- docker守护进程(docker deamon)
docker在后台运行的服务端程序,等待docker client的请求
4.docker组件
1.docker镜像
docker镜像是用于创建docker容器的模板,相当于面向对象编程中的类,一个docker镜像可以创建个docker容器
获取docker镜像
1 2
| docker pull nginx:alpine
|
构建docker镜像
使用Dockerfile进行构建docker镜像(后面会提到)
2.docker容器
实际提供服务的docker实例,基于docker镜像进行创建
创建并运行容器
1 2 3 4 5 6 7 8 9 10
| docker run -it image:tag command
|
启动或停止docker容器
1 2 3 4 5
| docker ps -a
docker start $(container_id) docker stop $(container_id)
|
和docker容器进行交互
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| docker exec -it /bin/bash
docker attach container_id
docker top container_id
docker logs container_id
docker inspect container_id
docker commit -a "" -m "" container_id image:tag
docker export container_id > ubuntu.tar
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
docker rm container_id
|
3.docker数据卷
因为docker容器中的数据在docker容器删除后会全部消失,因此可以借助docker容器数据卷来实现docker容i数据的本地持久化。docker容器数据卷永久有效,除非手动删除,并且docker数据卷可以让多个docker容器共享数据
数据卷的创建
1
| docker volume create volume_name
|
数据卷的挂载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| docker run -it -v volume_name:container_path image_name ``````
为docker容器提供网络 docker网络中一共有5种网络模式
* bridge docker的默认网络模式,创建一块虚拟网卡连接上物理网卡,所有的docker将库创建一对虚拟接口,vethð0一个在容器内,一个在网桥上,网桥提供路由功能,(可以想象为虚拟机内的nat模式)
* macvlan 创建一个虚拟网卡,直接连接至物理网卡,该网络模式下容器分配的ip地址和物理机在同一个网段(相当于虚拟机内的桥接模式)
* host 与宿主机共享网卡
* container 和已经存在的容器共享一块网卡
* none 不创建网络,无法联网
**docker网络的创建** ```bash docker network creat -d bridge --subnet=172.20.0.1/24 --gateway=172.20.0.1 -o parent=eth0 mybridge
|
5.dockerfile
什么是Dockerfile?
dockerfile是一个用于构建docker镜像的脚本,docker可以读取dockerfile文件自动构建docker镜像
dockerfile如何使用?
1 2 3 4
| docker build -t name:tag .
docker build -f /path/to/dockerfile -t name:tag
|
docker语法
1 2 3 4 5 6 7 8 9 10 11 12
| FROM
MAINTAINER
WORKDIR
RUN
EXPOSE
CMD
|
实例dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| FROM ubuntu:latest MAINTAINER bugprogram-git ENV TZ=Asia/Shanghai WORKDIR / RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list \ && apt-get update \ && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone \ apt-get install -y tzdata unzip wget npm curl \ && apt-get clean \ && apt-get autoclean \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* RUN mkdir /minecraft \ && mkdir /minecraft/dashboard \ && wget https://github.com/Suwings/MCSManager/archive/refs/tags/v8.6.23.zip \ && unzip v8.6.23.zip -d /minecraft/dashboard
&& mv /minecraft/dashboard/MCSManager-8.6.23/* /minecraft/dashboard && rm -rf /minecraft/dashboard/MCSManager-8.6.23 \ && apt purge -y unzip wget \ && apt autoremove -y \ && rm /v8.6.23.zip \ && cd /minecraft/dashboard && npm install EXPOSE [19132,23333]
ENTRYPOINT cd /minecraft/dashboard/ && npm start
|
5.docker安装和配置
1.docker安装
1.脚本安装
1 2
| curl -fsSL https://get.docker.com -o get-docker.sh ./get-docker.sh
|
2.包管理器安装
1 2 3 4
| pacman -S docker
apt install docker.io
|
2.docker配置
docker配置非root用户使用
1 2 3 4 5 6 7 8
| groupadd docker usermod -aG docker ${USER} newgrp docker systemctl restart
|
docker换源
编辑/etc/docker/daemon.json文件
1 2 3 4 5 6 7 8 9
| { "registry-mirrors": [ "https://hub-mirror.c.163.com", "https://ustc-edu-cn.mirror.aliyuncs.com", "https://ghcr.io", "https://mirror.baidubce.com" ] }
|
docker的启动和停止
1 2 3 4 5 6 7
|
systemctl start docker.service
systemctl stop docker.service
|
6.docker-compose
1.什么是docker-compose?
docker-compose是一个用python写的容器编排工具,在连续部署多个容器的时候,可以使用一个docker-compose脚本实现一次部署多个容器,大大提高了容器编排效率
2.如何使用docker-compose进行容器编排?
实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| version: '3.0' services: web: build: . image: nginx:alpine ports: - "5000:5000" volumes: - volumes:/code links: - redis redis: image: redis:latest volumes: redis:
networks: default: external: name: my-pre-existing-network
|
docker-compose常用的一些属性如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
| Compose和Docker兼容性: Compose 文件格式有3个版本,分别为1, 2.x 和 3.x 目前主流的为 3.x 其支持 docker 1.13.0 及其以上的版本
常用参数: version services
build context dockerfile args cache_from labels shm_size
command
container_name
deploy endpoint_mode vip dnsrr labels mode global replicated placement replicas resources limits cpus: "0.5" memory: 50M reservations cpus: "0.2" memory: 20M restart_policy condition none on-failure any delay max_attempts window update_config parallelism delay failure_action continue rollback pause monitor max_failure_ratio order stop-first start-first rollback_config parallelism delay failure_action continue pause monitor max_failure_ratio order stop-first start-first
注意: 支持 docker-compose up 和 docker-compose run 但不支持 docker stack deploy 的子选项 security_opt container_name devices tmpfs stop_signal links cgroup_parent network_mode external_links restart build userns_mode sysctls
devices
depends_on 示例: docker-compose up 以依赖顺序启动服务,下面例子中 redis 和 db 服务在 web 启动前启动 默认情况下使用 docker-compose up web 这样的方式启动 web 服务时,也会启动 redis 和 db 两个服务,因为在配置文件中定义了依赖关系 version: '3' services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
dns
dns_search
tmpfs
entrypoint
env_file 文件格式: RACK_ENV=development
environment
expose
external_links
extra_hosts
healthcheck test NONE CMD CMD-SHELL interval: 1m30s timeout: 10s retries: 3 start_period: 40s disable: true
image
init
isolation
labels
links
logging driver options max-size max-file
network_mode
networks aliases ipv4_address ipv6_address
示例: version: '3.7' services: test: image: nginx:1.14-alpine container_name: mynginx command: ifconfig networks: app_net: ipv4_address: 172.16.238.10 networks: app_net: driver: bridge ipam: driver: default config: - subnet: 172.16.238.0/24
pid: 'host'
ports SHORT 语法格式示例: - "3000" - "3000-3005" - "8000:8000" - "9090-9091:8080-8081" - "127.0.0.1:8001:8001" - "127.0.0.1:5000-5010:5000-5010" - "6060:6060/udp"
LONG 语法格式示例:(v3.2 新增的语法格式) ports: - target: 80 published: 8080 protocol: tcp mode: host
secrets
security_opt
stop_grace_period
stop_signal
sysctls
ulimits
userns_mode
volumes SHORT 语法格式示例: volumes: - /var/lib/mysql - /opt/data:/var/lib/mysql - ./cache:/tmp/cache - ~/configs:/etc/configs/:ro - datavolume:/var/lib/mysql
LONG 语法格式示例:(v3.2 新增的语法格式) version: "3.2" services: web: image: nginx:alpine ports: - "80:80" volumes: - type: volume source: mydata target: /data volume: nocopy: true - type: bind source: ./static target: /opt/app/static read_only: true volumes: mydata:
restart no always on-failure
其他选项: domainname, hostname, ipc, mac_address, privileged, read_only, shm_size, stdin_open, tty, user, working_dir 上面这些选项都只接受单个值和 docker run 的对应参数类似
对于值为时间的可接受的值: 2.5s 10s 1m30s 2h32m 5h34m56s 时间单位: us, ms, s, m, h 对于值为大小的可接受的值: 2b 1024kb 2048k 300m 1gb 单位: b, k, m, g 或者 kb, mb, gb networks driver bridge overlay host none driver_opts attachable ipam driver config subnet external name 文件格式示例: version: "3" services: redis: image: redis:alpine ports: - "6379" networks: - frontend deploy: replicas: 2 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure db: image: postgres:9.4 volumes: - db-data:/var/lib/postgresql/data networks: - backend deploy: placement: constraints: [node.role == manager]
|
7.小结
docker是一个非常方便的服务部署工具,不仅解决了开发环境和运行环境的不一致性,并且使用docker进行部署的服务非常容易进行迁移,并且docker使用联合文件系统,极大地节省了运行docker容器时候地资源,在实际生产开发中非常值得使用。