Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Dopcker常用命令

docker pull image - 拉取Image
docker container ls -a - 列出所有容器
docker run -it centos - 交互式运行
docker run -d containerid - 后台执行
docker run -p 80 imageid - 将容器的80端口随机映射到宿主机的一个端口上
docker run -p 8000:80 imageid - 将容器的80端口映射到宿主机的8000端口上
docker run --name web image - 以别名启动Image
docker container rm id - 删除container
docker imgae rm id - 删除Image
docker container ls -aq  - 列出所有container ID
docker rm $(docker container ls -aq) - 删除所有container
docker rm $(docker coontainer ls -f "status=exited" -q) - 删除所有已退出的container
docker commit containerName repository - 基于container构建Image(不提倡,建议通过Dockfile)
docker history imageid  - Image历史记录
docker build -t repository . - 基于当前目录Dockerfile构建Image
more Dockerfile - 查看Dockerfile
docker ps -a - 显示所有的容器,包括未运行的
docker run -d --link redis --name flask-redis -e REDIS_HOST=redis -p 6000:5000 jasonfan123/flask-redis - containei互相访问设置(-e设置环境变量)
docker rm -f container - 强制停止并删除container
Dokcer Container操作
docker exex -it containerid /bin/bash - 进入指定容器执行指定命令
docker stop containerid - 停止运行中的container
docker start containerid - 启动停止的container
docker inspect containerid - container详细信息

Dockerfile基本语法

# FROM - 基础镜像,尽量使用官方Image作为BaseImage
FROM scratch # - 制作baseImage(不使用任何Image)
FROM centos # - 使用baseImage
# LABEL - Image信息描述,Metadata不可少
LABEL version="1.0"
LABEL description="this is des"
# RUN - 执行命令并创建新的Image Layer,避免无用分层,合并多条命令为一行用&&, 复杂的可用反斜杠\换行
RUN yum update && yum install -y vim \ python-dev  # - 反斜杆换行
RUN apt-get update && apt-get install -y perl && rm -rf \ var/lib/apt/list/* # - 注意清理cache
# WORKDIR - 设定当前工作目录,用WORKDIR,不要用RUN cd,尽量使用绝对目录
WORKDIR /test # - 如果没有会自动创建test目录
WORKDIR demo
RUN pwd # - 输出结果应该是/test/demo
# ADD && COPY - 把本地环境文件添加到docker Image中
# ADD or COPY - 大部分情况COPY优于ADD,ADD除了COPY还有额外功能(解压),添加远程文件/目录请使用curl或者wget
ADD hello /
ADD test.tar.gz / # - 添加到根目录并解压
WORKDIR /root
ADD hello test/ - /root/test/hello
WORKDIR /ROOT
COPY hello test/ 
# ENV - 设置环境常量,尽量使用ENV增加可维护性
ENV MYSQL_VERSION 5.6 # - 设置常量
RUN apt-get install -y mysql-server="${MYSQL_VERSION}" \ && rm -rf /var/lib/apt/lists/* # - 引用常量
# VOLUME && EXPOER - 存储和网络
# CMD && ENTRYPOINT
# CMD - 设置容器启动后默认执行的命令和参数,如果docker run指定了其他命令,CMD命令被忽略,如果定义了多个CMD,只有最后一个会执行
# ENTRYPOINT -  设置容器启动时运行的命令,让容器以应用程序或者服务的形式运行,不会被忽略一定会执行,最佳实践:写一个shell脚本作为entrypoint
COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]
# Shell和Exec格式
# Shell格式 - 默认shell
RUN apt-get install -y vim
CMD echo "hello docker"
ENTRYPOINT echo “hello docker” 
# Exec格式 - 指定
RUN ["apt-get","install", "-y","vim"]
CMD ["/bin/echo", "hello docker"]
ENTRYPOINT ["/bin/echo", "hello docker"]
Docker Image Push
docker login
docker push jasonfan123/centos-vim-new:latest

数据持久化

# Dockerfile VOLUME # volume绕过container的文件系统,直接将数据写到host机器上,只是volume是被docker管理的,docker下所有的volume都在host机器上的指定目录下/var/lib/docker/volumes
# VOLUME /var/lib/mysql
docker volume ls - 查看volume
docker run -v mysql:/var/lib/mysql - 重命名volume:路劲
# Bind Mouting
docker -v $(pwd):/root/aaa - 将宿主机当前目录映射到容器目录

Docker Compose

多容器应用:拉取多个image、创建多个container、要管理这些container
Docker Compose 批处理,基于Docker的命令行工具,通过一个yml文件定义多容器的Docker应用,通过一条命令就可以根据yml文件去创建或者管理这个多个容器
# 默认名字:docker-compose.yml
# 三大概念: Services、Networks、Volumes
# Services:
    一个service代表一个container,可以从远程拉取iamge,也可以从本地的dockerfile build出来image
    service的启动类似docker run,可以指定network和volume
# docker-compose up - 启动多有yml文件容器,默认文件docker-compose.yml
# docker-compose up -d - 后台运行
# docker-compose -f xx.yml up - 指定yml文件  
# docker-compose ps - 列出services
# docker-compose start - 停止
# docker-compose stop - 停止
# docker-compose down - 停止并删除
# docker-compose exec mysql bash - 进入容器并执行
# docker-compose up --scale service=3 -d - 给service指定容器数量 (haproxy)
  
# wordprss & mysql 示例
version: '3'
services:
  wordpress:
    image: wordpress
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_PASSWORD: root
    networks:
      - my-bridge
  mysql:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: wordpress
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - my-bridge
volumes:
  mysql-data:
networks:
  my-bridge:
    driver: bridge

Swarm Mode

集成在docker中的容器编排工具

基于Docker的devops