微服务实践(一):Docker入门

2018-09-23  本文已影响60人  wch853

虚拟机与容器

相对于传统虚拟机,容器不需要Guest OS层,可以直接在本地操作系统之上实现应用的隔离。


虚拟机与容器

容器的作用

容器演变历史

传统部署

传统部署需要有物理机设备,在物理机上安装操作系统后部署应用。传统部署存在以下缺点:

传统部署
虚拟化技术

对物理服务器的资源(CPU、内存、硬盘等)通过Hypervisor做虚拟化,在虚拟化之上安装操作系统,构成虚拟机。这样使得一个物理机部署多个App,每个App独立运行在一个VM中。

容器技术
虚拟化+容器

Docker

Docker Platform

Docker提供了一个开发、打包、运行app的平台,把app和底层设施隔离开来。


Docker Platform

Docker Engine分为后台进程(dockerd)和CLI接口,是一个C/S模式的架构,它们之间通过REST API通信。


Docker Engine
Docker client可以操作Docker Host上的镜像和容器,Registry可以存储用户镜像。 Docker架构

安装Docker

# 安装
yum install docker-io -y
# 查看docker版本
docker version
# 启动Docker
systemctl start docker
# 设置开机启动
chkconfig docker on
# 配置国内镜像源
echo "OPTIONS='--registry-mirror=https://mirror.ccs.tencentyun.com'" >> /etc/sysconfig/docker
systemctl daemon-reload
systemctl restart docker

Docker Image(镜像)

docker分层文件系统
获取镜像的方式

Docker Container(容器)

构建Docker镜像

通过commit构建镜像

通过交互命令进入某个镜像,配置后通过exit命令退出。再通过docker commit创建image。

docker commit -m [MARK] [CONTAINER NAMES] [REPOSITORY]

通过build构建镜像

1.编写Dockerfile文件

# base image
FROM centos
# install vim
RUN yum install -y vim

2.构建镜像

docker build -t wch/centos-vim .

Dockerfile使用

# 制作base image
FROM scratch
# 使用base image
FROM centos

# 定义Metadata
LABEL maintainer="wch853@163.com"
LABEL version="1.0"
LABEL description="This is description"

# 执行命令并创建新的Image Layer,使用&&合并多条命令,使用\换行
RUN yum update && yum install -y vim \
    python-dev

# 设置容器启动时运行的命令;让容器以应用程序或者服务的形式运行;不会被忽略,一定会执行;可以运行一个shell脚本
COPY docker-entrypoint.sh /usr/local/bin
ENTRYPOINT ["docker-entrypoint.sh"]
    
# 设置容器启动后默认执行的命令和参数;如果docker run指定了其它命令,CMD忽略;如果定义了多个CMD,只有最后一个会执行
CMD echo "Hello docker!"

# 设定当前工作目录,没有会自动创建 
WORKDIR /demo

# 添加本地文件到指定目录
COPY file /
# 添加本地文件到指定目录并解压缩
ADD file.tar /

# 设置常量
ENV MYSQL_VERSION 5.7
RUN apt-get install -y mysql-server="${MYSQL_VERSION}" 

Shell与Exec格式
RUN apt-get install -y vim
CMD echo "Hello Docker!"
ENV param Docker
ENTRYPOINT echo "Hello $name!"
RUN ["apt-get", "install", "-y", "vim"]
CMD ["/bin/echo", "Hello Docker!"]
ENV param Docker
ENTRYPOINT ["/bin/bash", "-c", "echo Hello $name!"]

发布Docker镜像

# 登录docker hub
docker login
# 上传docker image
docker [image] push [REPOSITORY:TAG]
# 拉取docker image
docker pull [REPOSITORY:TAG]

Docker网络

使用Docker Network可以实现容器间的网络连接和隔离
[图片上传失败...(image-54436b-1537693810872)]

bridge

bridge是docker默认的网络类型,通过docker network inspect bridge命令查看该网络的详细信息。
docker启动后在linux宿主机上生成名为docker0的网桥,docker容器通过veth-pair连接到docker0上,不同的docker网络因此能够通信。容器通过docker0进行NAT转换为eth0的地址,就能够访问外部网络。


Docker Network
容器间link

容器间可以通过link的方式相互依赖,被依赖容器的name可以当做容器的host。

docker run -d --name os2 --link os1 [REPOSITORY]
端口映射
# 建立指定端口的映射关系
docker run -d -p 80:80 nginx
# 建立随机端口映射关系
docker run -d -P nginx

Docker数据持久化

Volume类型
# 将mysql配置文件和数据目录挂载到指定文件和目录
docker run -d -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_ROOT_HOST=% -p 3307:3306 -v d:/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf -v d:/docker/mysql/data:/var/lib/mysql --name=mysql mysql:5.7

命令

# 查看docker版本
docker version
# 查看docker image列表
docker image ls
docker images
# 删除Image
docker image rm [REPOSITORY] / [IMAGE ID]
docker rmi [REPOSITORY] / [IMAGE ID]
# 查看容器列表
docker ps [OPTIONS]
docker container ls
# 创建容器
docker build -t [NAME] [LOCATION]
# 查看Image分层
docker history [IMAGE ID]
# 运行Image
docker run [REPOSITORY]
# Container交互式运行
docker run -it [REPOSITORY]
# Container后台运行
docker run -d [REPOSITORY]
# 以指定NAME运行容器
docker run --name [REPOSITORY]
# 删除Container
docker container rm [CONTAINER ID]
docker rm [CONTAINER ID]
# 删除全部Container
docker rm $(docker ps -aq)
# 进入正在运行的容器
docker exec -it [CONTAINER ID] /bin/bash
# 停止正在运行的容器
docker stop [CONTAINER ID]
# 启动容器
docker start [CONTAINER ID]
# 在容器中修改配置,提交后成为新镜像
docker commit -m [MARK] [CONTAINER NAMES] [REPOSITORY]
# 查看docker网络
docker network inspect bridge
# 端口映射
docker run -d -p 80:80 [REPOSITORY]
# 查看容器端口隐射情况
docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]
# 查看容器日志
docker logs [OPTIONS] CONTAINER
# 查看docker数据卷
docker volume ls
# 删除未使用数据卷
docker volume prune
# 查看docker文件系统
docker system df
# 清除docker缓存
docker system prune
# 目录挂载
docker run -d - v /var/logs:/var/lib/logs [REPOSITORY]

容器编排

多容器的应用启动仅靠手工输入命令是非常困难的,一方面需要根据具体需求创建不同版本、不同数量的容器,另一方面要管理这些容器。这就需要容器编排工具对容器管理实现批处理。

docker-compose

docker-compose是一个命令行工具,通过定义的YAML文件可以管理多个容器。

docker-compose配置文件

version: '3'

services:
  zookeeper:
    image: zookeeper:3.4.13
    networks:
      # 定义连接网络
      - rpc-bridge

  redis:
    image: redis:latest
    command:
      # 持久化配置
      - "--appendonly yes"
    volumes:
      # 数据目录挂载
      - d:/docker/redis:/data
    networks:
      - component-bridge

  mysql:
    image: mysql:5.7
    environment:
      # 配置环境参数
      MYSQL_ROOT_PASSWORD: admin
      # 不限制host远程连接
      MYSQL_ROOT_HOST: "%"
    volumes:
      - d:/docker/mysql/data:/var/lib/mysql
      - d:/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf
    networks:
      - data-bridge

  server:
    image: my-server:1.0
    links:
      # 关联服务
      - mysql
    command:
      - "--mysql.address=mysql:3306"
    networks:
      - rpc-bridge
      - data-bridge

  web:
    image: my-web:1.0
    links:
      - redis
      - zookeeper
      - server
    volumes:
      - d:/docker/app/logs/course-web:/var/app/logs/course-web
    command:
      - "--server.port=8080"
      - "--server.host=server"
      - "--redis.host=redis"
      - "--redis.port=6379"
      - "--registry.address=zookeeper:2181"
    networks:
      - rpc-bridge
      - component-bridge
      - net-bridge

  api-gateway:
    image: my-api-gateway:1.0
    links:
      - web
    command:
      - "--web.host=web"
      - "--web.port=8080"
    ports:
      # 映射宿主机端口
      - 80:80
    networks:
      - net-bridge

# 定义容器网络
networks:
  net-bridge:
    driver: bridge
  component-bridge:
    driver: bridge
  data-bridge:
    driver: bridge
  rpc-bridge:
    driver: bridge

docker-compose命令

# 使用docker-compose后台启动容器
docker-compose -f [FILENAME] up -d
# 查看容器状态
docker-compose ps
# 停止并删除容器
docker-compose down 
# 进入容器终端
docker-compose exec [SERVICE] bash
# 扩容/缩容
docker-compose up --scale [SERVICE]=[NUM] -d
上一篇下一篇

猜你喜欢

热点阅读