转载

Spring Cloud Alibaba-Docker(二十六)

官方地址

  • Uninstall old versions
sudo yum remove docker /
                  docker-client /
                  docker-client-latest /
                  docker-common /
                  docker-latest /
                  docker-latest-logrotate /
                  docker-logrotate /
                  docker-engine
复制代码
  • Install using the repository
# Install required packages
sudo yum install -y yum-utils /
  device-mapper-persistent-data /
  lvm2
# Use the following command to set up the stable repository
sudo yum-config-manager /
    --add-repo /
    https://download.docker.com/linux/centos/docker-ce.repo
复制代码
  • INSTALL DOCKER ENGINE - COMMUNITY
sudo yum install docker-ce docker-ce-cli containerd.io
复制代码
  • Start Docker
sudo systemctl start docker
复制代码
  • Verify that Docker Engine
sudo docker run hello-world
复制代码

Docker Image

概念

todo

vagrant用户使用docker命令

  • 授权
# Adding user vagrant to group docker
sudo gpasswd -a vagrant docker
sudo service docker restart
复制代码
  • 重新登陆
exit
vagrant ssh
复制代码

Docker Image

  • 自己构建Base Image

    • c文件
    #include<stdio.h>
      
    int main()
    {
     printf("hello docker/n");
    }
    复制代码
    • 编译
    gcc -static hello.c -o hello
    复制代码
    • Dockerfile
    # 制做Base Image
    FROM scratch
    ADD hello /
    CMD ["/hello"]
    复制代码
    • 构建
    docker build -t zzh/test .
    复制代码
    • 运行
    docker run zzh/test
    复制代码
  • 在已有Base Image基础上构建Image

    • 方式一:命令
    # 拉一个centos的Image
    docker pull centos
    # 相互模式运行centos
    docker run -it centos
    # 下载vim
    yum install vim -y
    # 退出container
    exit;
    # 查询container
    docker container ls -a
    # 构建Image
    docker build docker commit -a "zzh" -m "centos with vim" ac327be41bb1 zzh/centos
    # 清理所有container
    docker rm $(docker container ls -aq)
    # 清理Image
    docker rmi 21fb0d14f197
    复制代码
    • 方式二:Dockerfile
    # Dockerfile文件
    # 使用Base Image
    From centos
    yum install vim -y 
    复制代码
    # 构建命令
    docker build -t zzh/centos-vim .
    # 退出container
    exit;
    # 清理所有container
    docker rm $(docker container ls -aq)
    # 清理Image
    docker rmi ae813e1893f3
    复制代码
    • 本质(只是在centos基础上多了一层Image Layer)
    Spring Cloud Alibaba-Docker(二十六)

Docker Container

概念

todo

Dockerfile

  • 例子: 官方Dockerfile
  • 文档: 官方Dockerfile文档说明
  • FROM
# 制作Base Image
FROM scratch
# 使用Base Image
FROM centos
复制代码
  • LABEL(metadata)
LABEL maintainer="xxx@qq.com"
LABEL version="1.0"
LABEL description="test"
复制代码
  • RUN
# &&联接两个命令,/换行,一个RUN一层,建议用&&写一起,避免无用分层
RUN yum update && yum install -y vim /
python-dev 
复制代码
  • WORKDIR
# 不存在就创建
WORKDIR /test
WORKDIR demo
# 结果/test/demo,不要使用RUN cd,尽量使用绝对路径
RUN pwd 
复制代码
  • ADD && COPY
# 相同:把文件拷贝到指定目录
# 不同:ADD如果拷贝压缩文件会自动解压,优先使用COPY
ADD hello /
COPY hello /
# /root/test/hello
WORKDIR /root
ADD hello test/
复制代码
  • ENV
# 定义常量,之后用"${MYSQL_VERSION}"获取5.6
ENV MYSQL_VERSION 5.6
复制代码
  • RUN && CMD && ENTRYPOINT
RUN:执行命令且创建新的Image Layer
CMD:设置容器启动后默认执行的命令和参数,如果docker run指定了其他命令,CMD命令被忽略如docker run -it centos /bin/bash,定义了多个CMD只会执行最后一个
ENTRYPOINT:设置容器启动时运行的命令,让容器以应用程序的行程运行,一定会执行
复制代码

镜像发布

Docker Hub

# 输入账号密码登陆
docker login
docker push xxx/test:latest
复制代码

私有Registry 官方地址

# 另外一台服务器上安装docker后执行
docker run -d -p 5000:5000 --restart always --name registry registry:2
# 构建image
docker build -t ip:5000/hello-world .
# 安全
cd /etc/docker/
# 内容{"insecure-registries":["ip:5000"]}
vim daemon.json
sudo vim /lib/systemd/system/docker.service
# 重启docker
sudo service docker restart
复制代码

docker.service加一行

Spring Cloud Alibaba-Docker(二十六)

打开地址http://ip:5000/v2/_catalog,查看是否已经push到registry

Docker Network

  • none:容器无法与外界通信
  • host:容器和虚拟机共享Network,有端口冲突风险
  • bridge:容器和虚拟机通过连接一一对应(docker0<->vethXXXX)

ping && telnet

  • ping :验证IP的可达性
  • telnet:验证服务的可达性
  • ping测试,Wireshark抓取
Spring Cloud Alibaba-Docker(二十六)

Linux Network Namespace

Spring Cloud Alibaba-Docker(二十六)
# 启动两个容器
docker run -d --name test1 busybox /bin/sh -c "while true;do sleep 3600;done"
docker run -d --name test2 busybox /bin/sh -c "while true;do sleep 3600;done"
# 查询docker网络
docker network ls
# 新建bridge
docker network create -d bridge my-bridge
# docker run指定bridge,连接my-bridge的容器自动link好了,一个容器可以同时连接多个bridge,但是不互通除非同时在。
--network my-bridge
# docker run指定link,可以通过test2:80这样的方式访问,类似dns解析
--link test2
# 连接bridge
docker network connect my-bridge test2 
# 端口映射
-p 80:80
复制代码

虚拟机网络情况

Spring Cloud Alibaba-Docker(二十六)

brctl show

Spring Cloud Alibaba-Docker(二十六)

docker inspect bridge

Spring Cloud Alibaba-Docker(二十六)

总体

Spring Cloud Alibaba-Docker(二十六)

多容器通信

todo

docker overlay & etcd

持久化存储和数据共享

方案一:基于本地文件系统的Volume

可以在执行Docker create/Docker run时,通过-v参数将主机的目录作为容器的数据卷。这部分功能是基于本地文件系统的volume管理

方案二:基于plugin的Volume

支持第三方存储方案,例如aws等云厂商

Volume类型

  • 受管理的data Volume,又docker后台自动创建
  • 绑定挂载的Volume,具体挂载位置可以由用户指定

Mysql案例

Mysql的Dockerfile和安装指南

  • Data Volume
# mysql 
docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
# 查看日志
docker logs mysql1
# 查看volume
docker volume ls
# 进入mysql容器
docker exec -it mysql1 /bin/bash
# 添加database
mysql -u root
create database docker;
show databases;
# 停止和删除容器
docker rm -f mysql1
# 重新创建容器用上一个volume,发现docker还在
docker run -d -v mysql:/var/lib/mysql --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
# 删除volume
docker volume rm id
复制代码
  • Bind Mouting
# 当前目录下的index.html和容器内/usr/share/nginx/html的index.html同步,修改外面的=修改容器内部的
docker run -d -p 80:80 -v $(pwd):/usr/share/nginx/html  --name test nginx
复制代码

Docker Compose

Docker Compose是一个通过yml文件可以同时创建/管理多个容器的工具。 官方地址

  • 安装
# 通过官方的方法太慢,这里通过python-pip安装
sudo yum -y install epel-release
sudo yum install python-pip
sudo pip install --upgrade pip
sudo pip --default-timeout=200 install -U docker-compose
docker-compose --version
复制代码
  • yml
version: '3'

services:

  wordpress:
    image: wordpress
    ports:
      - 8080:80
    depends_on:
      - mysql
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_PASSWORD: root
    networks:
      - my-bridge

  mysql:
    image: mysql:5.7
    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
复制代码
# 运行(默认名称docker-compose.yml可以不指定)
docker-compose -f docker-compose.yml up -d
# 启动
docker-compose start
# 查看Image
docker-compose images
# 进入容器
docker-compose exec mysql bash
# 停止
docker-compose stop
# 停止容器服务且删除容器
docker-compose down
# 水平拓展(先启动一台test再执行)
docker-compose --scale test=3 -d 
复制代码
原文  https://juejin.im/post/5dc7c63551882551e4776372
正文到此结束
Loading...