CHEATSHEET April 13, 2017

Docker

Words count 38k Reading time 34 mins. Read count 0

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

0%