Docker浅尝(一)

一 Container和Image

  • Docker底层技术支持
Namespaces:隔离pid/net/ipc/mnt/uts;
Control groups:资源限制;
UnionFileSystem:容器和镜像的分层;
  • Image
Image是文件和meta data的集合,文件为rootfs;
Image分层,且可以共享layer,本身只读;
Image获取 build from dockerfile / pull from registy
  • Container
Container通过Image创建,并在其之上创建一个可读写的ContainerLayer;
Container类似于Image对象的实例,Image负责app的存储和分发,Container负责app的运行;
  • Dockerfile
FROM:为了安全尽量使用官方的Image作为base image
FROM scratch #制作base image 
FROM centos  #使用base image

LABEL:定义Image的mata data
LABEL maintainer="lvzhiweiheal@163.com"
LABEL version="1.0"
LABEL description="This is my email."

RUN:每运行一次生成新的一层
RUN yum update && yum install -y vim \
  python-dev #&&避免分层,\换行

WORKDIR:切换到新目录,尽量使用绝对路径
WORKDIR /test
WORKDIR demo
RUN pwd ##/test/demo

ADD/COPY:COPY优先于ADD,ADD额外解压,远程目录或文件选择curl/wget

ENV:设置环境变量,尽量使用
ENV MYSQL_VERSION 5.6

CMD VS ENTRYPOINT
CMD:
容器启动时默认执行的命令,如果docker run指定其他命令,CMD会被忽略,定义多个CMD,执行最后一个
ENTRYPOINT:
不会被忽略,一定会被执行,让容器以应用程序或者服务的方式执行
  • Container limit
底层通过Control groups限制
--memory
--cpu-shares

二 网络

  • bridge
两个容器之间是通过bridge实现通信的,容器与bridge通过veth实现连接;
容器访问外网是通过bridge和nat实现的;
container1  \
              bridge -- nat -- Internet 
container2  /
  • host
无自己独立的networknamespace,与主机共享相同的networknamespace;
  • none
创建孤立的networknamespace,仅类似下面的方式可以访问;
sudo docker exec -it test1 /bin/sh
  • link
创建container2时,使用--link container1,container2可以代替container1的IP而使用container的名字访问,container1不可反向使用;
容器连接到自定义的bridge上面时,自身具备link功能;
sudo docker network create -d bridge mybridge 
##自定义bridge
brctl show 
##show当前的bridge
sudo docker run -d --name test1 --network my-bridge busybox /bin/sh -c "while true; do sleep 3600; done" 
##创建新容器连接到自定义bridge
sudo docker netwrok inspect my-bridgeID 
##查看某个network的具体信息
  • port map
##将容器的80端口映射到虚拟机的80端口
sudo docker run --name web -d -p 80:80 nginx
  • VXLAN
容器网络通过VXLAN实现,底层称为underlay,上层称为overlay;

三 持久化存储

  • Data Volume
#将Docker hub中mysql的Dockfile中的挂载点更改名称
VOLUME ["/var/lib/mysql"]
sudo docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOQ_EMPTY_PASSWORD=true mysql
  • Bind Mounting
#本机目录和容器目录做映射
sudo docker run -d -v $(pwd):/usr/share/nginx/html -p 80:80 --name web lzw/my-nginx

四 Docker Compose多容器部署

  • Docker Compose
Docker Compose是一个工具,通过一条yml文件定义去创建或者管理多个容器
  • docker-compose.yml
##一个yml的案例
version: "3"

services:
  wordpress:
    image: wordpress
    ports:
      - 8080:80
    enviroment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_PASSWORD: root
    networks:
      - my-bridge
  mysql:
    image: mysql
    enviroment:
      - MYSQL_ROOT_PASSWORD: root
      - MYSQL_DATABASE: wordpress
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - my-bridge
volumes:
  mysql-data:
networks:
  my-bridge:
    driver: bridge
  • scale水平扩展和负载均衡
version: "3"

services:
  redis:
    image: redis
  web:
    build:
      context: .
      dockerfile: Dockerfile
    ##因实现水平扩展不能转换端口
    enviroment:
      REDIS_HOST: redis
  lib:
    image: dockercloud/haproxy
    links:
      - web
    ports:
      - 8080:80
    volumns:
      - /var/run/docker.sock:/var/run/docker.sock
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • docker image 相关操作 显示所有 image 拉去 registry 中的已有 image 删除 im...
    Good灿灿阅读 8,670,735评论 0 2
  • 一 、什么是 Docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国...
    Blazzer阅读 3,158评论 0 13
  • 菩提无树本清心, 千年静修气沁神。 他日成泥化归去, 方留尘世待人吟。
    非洲鲫鱼阅读 151评论 2 3
  • 匆匆数年,已是大学毕业,二十几岁的年龄,怀揣着对未来的向往,来到了期望已久的社会生活。初入社会,才知原来并非你想...
    南伊公子阅读 433评论 0 1
  • 1、 昨晚和514宿舍的姑娘们在群里闲聊时,她们问起学长的近况。我说,他已经结婚了! 学长就是那个曾让我茶不思饭不...
    双眼皮二狗阅读 2,073评论 4 5