Contents
  1. 1. Info
  2. 2. install
    1. 2.1. 国内加速registry-mirrors
    2. 2.2. 免sudo运行
    3. 2.3. windows hyper-v
    4. 2.4. 容器内网络问题
    5. 2.5. 慎用latest标签
    6. 2.6. docker建wordpress
    7. 2.7. 常用命令
    8. 2.8. 通过Dockerfile创建镜像
    9. 2.9. Docker Compose
  • Windows环境下的使用
    1. 1. 安装
    2. 2. 配置
    3. 3. 常用环境
      1. 3.1. mysql
      2. 3.2. hive
      3. 3.3. 编译环境
        1. 3.3.1. 实例使用
      4. 3.4. Hive服务 – 挂起,可以直连mysql代替
      5. 3.5. Hadoop - 参考并结合编译环境
    4. 4. 复制文件到容器
  • Info

    moby、docker-ce与docker-ee
    最早的时候docker就是一个开源项目,主要由docker公司维护。

    2017年年初,docker公司将原先的docker项目改名为moby,并创建了docker-ce和docker-ee。

    这三者的关系是:

    moby是继承了原先的docker的项目,是社区维护的的开源项目,谁都可以在moby的基础打造自己的容器产品

    docker-ce是docker公司维护的开源项目,是一个基于moby项目的免费的容器产品
    docker-ee是docker公司维护的闭源产品,是docker公司的商业产品。

    install

    moby: yum install docker

    docker-ce: curl -fsSL https://get.docker.com/ | sh

    国内加速registry-mirrors

    Docker Engine配置 /etc/docker/daemon.json

    1
    2
    3
    4
    "registry-mirrors": [
    "http://hub-mirror.c.163.com",
    "https://registry.docker-cn.com"
    ]

    https://hub.daocloud.io/

    免sudo运行

    问题:

    默认安装完 docker 后,每次执行 docker 都需要运行 sudo 命令,非常浪费时间影响效率

    解决方案:

    将用户加入该docker的group内,重新打开终端。
    Add the connected user “${USER}” to the docker group.

    1
    2
    sudo gpasswd -a ${USER} docker
    sudo service docker restart

    windows hyper-v

    与安卓模拟器(夜神、mumu)冲突,考虑关闭hyper-v,虚拟机装linux用docker

    mumu模拟器X版本兼容hyper-v

    容器内网络问题

    问题:

    Docker Daemon默认给Docker Container的DNS设置为8.8.8.8和8.8.4.4,但在国内这两个DNS服务不稳定,由此影响到网络。

    解决方案:

    1. 临时方案:使用docker run命令启动容器的时候,设定–dns参数,如:
    1
    docker run -it --dns=172.20.1.4 ubuntu
    1. 全局修改:以上临时方案仅适用于docker run命令,docker build因为没有dns参数所以不能效仿。

    编辑/etc/default/docker添加–dns参数到Docker Daemon的DOCKER_OPTS

    1
    2
    3
    4
    sudo vi /etc/default/docker
    # 末尾添加 DOCKER_OPTS="--dns 172.20.1.4"
    sudo service docker stop
    sudo service docker start

    慎用latest标签

    latest并不是永久赋予某一特定Docker镜像的标签,在t1使用latest镜像,应用容器运行正常;t2使用同一个Dockerfile来build镜像再运行应用容器,失效。
    比如t1时ubuntu镜像的latest标签于ubuntu:14.04,t2时该latest标签属于ubuntu:16.04。因此Docker镜像建议使用指定的tag

    docker建wordpress

    1
    2
    docker run --name wp-mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
    docker run --name my-wordpress --link wp-mysql:mysql -p 8080:80 -d -e WORDPRESS_DB_PASSWORD=root wordpress

    常用命令

    镜像管理

    • docker search ubuntu 搜索镜像
    • docker pull ubuntu:1604 获取指定版本镜像
    • docker images 列出本地所有镜像
    • docker rmi ubuntu:1604 删除镜像
    • docker build -t nginx:v3 . 使用Dockerfile构建镜像,并指定标签
    • docker history nginx:v2 查看镜像历史

    容器运行

    • docker run ubuntu:1604 创建并运行一个容器
    • docker run 其他参数
      • -name testContainer 指定容器名称
      • -p 80:80 指定端口映射
      • -P 随机端口,可通过docker port ID/name 查看
      • -it 交互
      • -d 后台运行,可通过docker attach ID/name连接容器
      • -v 主机目录:容器目录 主机目录必须是绝对路径,如果不存在docker自动创建

    容器管理

    • docker info
    • docker ps -a 查看所有容器
    • docker rm $(docker ps -a -q) 删除所有容器
    • docker start ID/name
    • docker stop ID/name
    • docker attach ID/name 进入容器正在执行的终端,不开启新进程
    • docker exec -it 容器id bashshell 进入容器后开启新的终端,可进行操作
    • docker logs ID/name
    • docker logs -f ID/name 持续日志流
    • docker diff ID/name 查看容器变化
    • docker commit –author manhua –message 修改了默认网页 ID/name nginx:v2 将容器保存为image
    • exit 退出容器
    • ctrl+P+Q 退出不停止

    docker inspect | grep IPAddress 查看ip

    通过Dockerfile创建镜像

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 说明该镜像以哪个镜像为基础
    FROM centos:latest

    # 构建者的基本信息
    MAINTAINER manhua

    # 在build这个镜像时执行的操作
    RUN yum update
    RUN yum install -y git

    # 拷贝本地文件到镜像中
    COPY ./* /usr/share/gitdir/


    docker build -t=”manhua/centos:gitdir” .
    其中-t用来指定新镜像的用户信息、tag等。最后的点表示在当前目录寻找Dockerfile。
    docker build -f .\maven.txt -t “manhua/building” .

    FROM基础镜像,DockerHub中99%的镜像都是FROM scratch
    MAINTAINER镜像是谁写的,姓名+邮箱
    RUN运行命令
    ADD添加内容,可解压tar包(不同于COPY的地方)
    WORKDIR镜像工作目录
    VOLUME挂载的目录
    EXPOSE指定暴露端口(同-P指令)
    CMD指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行,可被替代。
    ENTRYPOINT如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。ENTRYPOINT可追加命令。每个 Dockerfile 中只能有一个 ENTRYPOINT ,当指定多个时,只有最后一个起效。
    ONBUILD当构建一个被继承DockerFile这个时候就会运行ONBUILD指令。触发指令
    COPY类似ADD,将我们的文件拷贝到镜像中ENV构建时设置环境变量

    Docker Compose

    用于定义和运行多容器 Docker 的应用程序工具
    docker-compose -v

    Windows环境下的使用

    安装

    https://docs.docker.com/get-docker/
    https://hub.docker.com/

    新版建议使用基于WSL2,使用异常会涉及以下命令:
    wsl –install
    wsl –update
    wsl –set-version 2
    wsl –status
    wsl –version
    wsl –shutdown
    wsl –unregister docker-desktop-data
    wsl –terminate
    wsl –list –verbose
    wsl –distribution

    配置

    常用环境

    mysql <– metastore
    metastore <– HDFS
    metastore <– Spark
    HDFS <– Spark

    HDFS和metastore建议捆绑,因为metastore需要HADOOP_HOME

    mysql

    1
    docker run -di --name mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

    hive

    Dockerfile

    docker pull centos:7

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    FROM centos:7
    RUN yum install -y wget java-1.8.0-openjdk-devel && yum clean all
    WORKDIR /install
    RUN yum install -y ca-certificates && yum clean all
    # RUN wget https://dlcdn.apache.org/hive/hive-standalone-metastore-3.0.0/hive-standalone-metastore-3.0.0-bin.tar.gz
    COPY hive-standalone-metastore-3.0.0-bin.tar.gz hive-standalone-metastore-3.0.0-bin.tar.gz
    RUN tar zxf hive-standalone-metastore-3.0.0-bin.tar.gz
    RUN rm -f hive-standalone-metastore-3.0.0-bin.tar.gz
    RUN mv apache-hive-metastore-3.0.0-bin metastore

    # RUN wget https://cdn.mysql.com/archives/mysql-connector-java-5.1/mysql-connector-java-5.1.49.tar.gz
    COPY mysql-connector-java-5.1.49.tar.gz mysql-connector-java-5.1.49.tar.gz
    RUN tar xf mysql-connector-java-5.1.49.tar.gz --strip-components=1 -C ./metastore/lib mysql-connector-java-5.1.49/mysql-connector-java-5.1.49.jar
    RUN rm mysql-connector-java-5.1.49.tar.gz

    # RUN wget http://${HTTP_SERVER_HOSTNAME}/downloads/hadoop-3.2.2.tar.gz
    COPY hadoop-3.3.6.tar.gz hadoop-3.3.6.tar.gz
    RUN tar xf hadoop-3.3.6.tar.gz
    RUN rm -f hadoop-3.3.6.tar.gz

    ENV JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
    ENV HADOOP_HOME=/install/hadoop-3.3.6

    COPY metastore-site.xml /install/metastore/conf/
    RUN ./metastore/bin/schematool -initSchema -dbType mysql

    CMD ["/install/metastore/bin/start-metastore"]
    metastore-site.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
    <property>
    <name>metastore.thrift.uris</name>
    <value>thrift://localhost:9083</value>
    </property>
    <property>
    <name>metastore.warehouse.dir</name>
    <value>hdfs://192.168.56.112:9000/hive</value>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://ip:3306/hive?createDatabaseIfNotExist=true&amp;characterEncoding=UTF-8&amp;useSSL=false&amp;allowPublicKeyRetrieval=true</value>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>123456</value>
    </property>
    <property>
    <name>hive.metastore.schema.verification</name>
    <value>false</value>
    </property>
    <property>
    <name>datanucleus.schema.autoCreateAll</name>
    <value>true</value>
    </property>
    <property>
    <name>metastore.task.threads.always</name>
    <value>org.apache.hadoop.hive.metastore.events.EventCleanerTask</value>
    </property>
    <property>
    <name>metastore.expression.proxy</name>
    <value>org.apache.hadoop.hive.metastore.DefaultPartitionExpressionProxy</value>
    </property>
    </configuration>

    注意IP由docker network inspect bridge docker inspect <MySQL CONTAINER ID> |grep IPAddress获得

    docker build -t manhua_hivemeta:v1 .

    docker run -d -p 9083:9083/tcp –add-host=host.docker.internal:host-gateway –name hivemeta manhua_hivemeta:v1

    编译环境

    bash脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    docker pull ubuntu
    docker run --name dev -h dev -it ubuntu

    docker attach dev

    sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/' /etc/apt/sources.list

    apt-get update
    apt-get install -y vim
    apt-get install -y less
    apt-get install -y git
    apt-get install -y wget

    INSTALL_PATH=/data/soft
    mkdir -p $INSTALL_PATH
    cd $INSTALL_PATH

    wget https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz
    binJDK=jdk-8u202-linux-x64.tar.gz
    tar -xf ${binJDK} -C $INSTALL_PATH
    folder=`tar -tf ${binJDK} |head -1`
    echo $folder
    pushd $INSTALL_PATH
    ln -s $folder jdk
    popd
    echo -e '\n\n#Java' >> /etc/profile
    echo 'export JAVA_HOME='${INSTALL_PATH}'/jdk' >> /etc/profile
    echo 'export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH' >> /etc/profile
    echo 'export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib' >> /etc/profile
    source /etc/profile
    java -version && rm jdk-8u202-linux-x64.tar.gz


    wget https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz
    binMvn=apache-maven-3.8.8-bin.tar.gz
    tar -xf ${binMvn} -C $INSTALL_PATH
    echo -e '\n\n#MVN' >> /etc/profile
    echo 'export MVN_HOME='${INSTALL_PATH}'/apache-maven-3.8.8' >> /etc/profile
    echo 'export PATH=$MVN_HOME/bin:$PATH' >> /etc/profile
    source /etc/profile
    mvn -v && rm apache-maven-3.8.8-bin.tar.gz

    vi apache-maven-3.8.8/conf/settings.xml



    >> thrift部分可以跳过 =>> 使用正式版,不编译format模块
    apt-get install -y automake bison flex g++ git libboost-all-dev libevent-dev libssl-dev libtool make pkg-config
    wget https://dlcdn.apache.org/thrift/0.18.1/thrift-0.18.1.tar.gz
    srcThrift=thrift-0.18.1.tar.gz
    tar -xf ${srcThrift}
    folder=`tar -tf ${srcThrift} |head -1`
    echo $folder
    pushd $folder
    ./configure --help
    ./configure --without-python
    make -j4 && make install
    popd
    thrift -version

    mkdir -p /data/code/

    docker commit git-maven git-maven:v0

    实例使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    docker run --name carbon-dev -h carbon-dev -it git-maven:v0

    cd /data/code/
    git clone --depth 1 https://github.com/apache/carbondata.git

    cd carbondata
    git remote update origin --prune

    git branch
    git checkout -b dev(本地分支名) origin/xxBranch

    git tag
    git checkout -b 本地分支 远程tag
    git checkout -b 2.3.0 apache-carbondata-2.3.0-rc2

    git remote add github https://github.com/apache/carbondata.git
    git remote update github --prune

    commit id

    cd carbondata/
    mvn clean -DskipTests -T4 -Pspark-3.1 package

    使用visual studio code可以直接attach到运行中的容器修改代码

    Hive服务 – 挂起,可以直连mysql代替

    1
    2
    3
    4
    5
    6
    7
    8
    docker run --name hive -h hive -it manhua/mvn

    ## 尝试meta standalone
    docker cp hive-standalone-metastore-3.0.0-bin.tar.gz hive:/data/soft/
    docker cp apache-hive-3.1.3-bin.tar.gz hive:/data/soft/
    docker cp mysql-connector-java-5.1.47.jar hive:/data/soft


    Hadoop - 参考并结合编译环境

    复制文件到容器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    CMD
    set INSTALL_PATH=/data/soft
    echo %INSTALL_PATH%

    PowerShell
    $INSTALL_PATH="/data/soft"
    $INSTALL_PATH

    docker cp jdk-8u202-linux-x64.tar.gz hadoop1:$INSTALL_PATH
    docker cp apache-hive-3.1.3-bin.tar.gz hadoop1:$INSTALL_PATH
    docker cp hive-standalone-metastore-3.0.0-bin.tar.gz hadoop1:$INSTALL_PATH
    docker cp hadoop-3.3.1.tar.gz hadoop1:$INSTALL_PATH
    docker cp spark-3.3.1-bin-hadoop2.tgz hadoop1:$INSTALL_PATH
    #docker cp apache-zookeeper-3.7.1-bin.tar.gz hadoop1:$INSTALL_PATH
    docker cp mysql-connector-java-5.1.47.jar hadoop1:$INSTALL_PATH
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    docker network create --subnet=172.10.0.0/16 hadoop-net

    docker run --name hadoop1 --net hadoop-net --ip 172.10.0.2 -h hadoop1 --add-host hadoop2:172.10.0.3 -it manhua/mvn


    #安装基础软件
    apt-get update
    apt-get install -y vim net-tools ssh systemctl

    #ssh需要创建个目录
    mkdir -p /run/sshd
    systemctl enable ssh
    systemctl start ssh
    ssh-keygen -t rsa -P ""
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    ssh root@hadoop1


    tar -xf hadoop-3.3.1.tar.gz
    ln -s hadoop-3.3.1 hadoop

    vim hadoop/etc/hadoop/slaves
    hadoop1
    hadoop2

    tar -xf spark-3.3.1-bin-hadoop2.tgz
    ln -s spark-3.3.1-bin-hadoop2 spark

    #提交cloud1容器,命令返回新镜像的编号
    #为新镜像打标签为Spark
    docker commit hadoop1 hadoop:v0

    #删除原来的hadoop1容器,重新创建
    docker stop hadoop1
    docker rm hadoop1

    多台部署

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    # 50070 端口
    # 8088 端口
    # 7077 端口 spark
    # 9000 端口 hdfs
    # 16010 端口 hbase
    # 2181 端口 zookeeper
    # 10000 端口 hive server
    docker run --name hadoop1 \
    -p 50070:50070 \
    -p 8088:8088 \
    -p 8080:8080 \
    -p 7077:7077 \
    -p 9000:9000 \
    -p 16010:16010 \
    -p 2181:2181 \
    -p 10000:10000 \
    --net spark-net --ip 172.10.0.2 \
    -h hadoop1 \
    --add-host hadoop1:172.10.0.2 \
    --add-host hadoop2:172.10.0.3 \
    -it hadoop:v0

    docker run --name hadoop2 \
    --net spark-net --ip 172.10.0.3 \
    -h hadoop2 \
    --add-host hadoop1:172.10.0.2 \
    --add-host hadoop2:172.10.0.3 \
    -it hadoop:v0