一 Container和Image
Namespaces:隔离pid/net/ipc/mnt/uts;
Control groups:资源限制;
UnionFileSystem:容器和镜像的分层;
Image是文件和meta data的集合,文件为rootfs;
Image分层,且可以共享layer,本身只读;
Image获取 build from dockerfile / pull from registy
Container通过Image创建,并在其之上创建一个可读写的ContainerLayer;
Container类似于Image对象的实例,Image负责app的存储和分发,Container负责app的运行;
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:
不会被忽略,一定会被执行,让容器以应用程序或者服务的方式执行
底层通过Control groups限制
--memory
--cpu-shares
二 网络
两个容器之间是通过bridge实现通信的,容器与bridge通过veth实现连接;
容器访问外网是通过bridge和nat实现的;
container1 \
bridge -- nat -- Internet
container2 /
无自己独立的networknamespace,与主机共享相同的networknamespace;
创建孤立的networknamespace,仅类似下面的方式可以访问;
sudo docker exec -it test1 /bin/sh
创建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的具体信息
##将容器的80端口映射到虚拟机的80端口
sudo docker run --name web -d -p 80:80 nginx
容器网络通过VXLAN实现,底层称为underlay,上层称为overlay;
三 持久化存储
#将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
#本机目录和容器目录做映射
sudo docker run -d -v $(pwd):/usr/share/nginx/html -p 80:80 --name web lzw/my-nginx
四 Docker Compose多容器部署
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
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