Docker 学习笔记

# 常用的几个docker命令
# 创建docker-machine命令,并且挂载相应目录和修改镜像源为国内的镜像源
docker-machine create \
--engine-registry-mirror http://hub-mirror.c.163.com \
--virtualbox-share-folder "D:\WorkSpace:/d/WorkSpace" \
default
# 根据镜像创建一个容器
docker run -itd ubuntu/ubuntu
# 根据镜像创建一个容器并挂载目录(挂载目录的话只能在 win cmd 下运行)
# 在 cmd 命令下创建容器
winpty cmd
# 创建并且挂载目录,挂载目录的命令只能在 win cmd 下正常使用,在git bash中会报错
docker run -itd -v /d/WorkSpace:/home/work node
# 打开一个bash并且附在终端上
docker exec -it ubuntu-test bash
# 后台启动一个容器
docker start ubuntu-test
# 构建docker镜像!
# docker build -t(tag) [构建者名称/镜像名称:版本名称]|[镜像名称:版本名称] 指定dockerfile 指定构建目录
docker build -t ddl-python:xgb -f /root/onlinemodels-python/Dockerfile /root/onlinemodels-python/

docker build -t python:xgb .
# 查看所有的容器(包括正在运行当中的和已经停止了的)
docker ps -a -q
# 停止所有容器
docker stop $(docker ps -a -q)
# 根据镜像创建并运行一个容器 并且执行命令
docker run -d -p 28080:8080 python:xgb
# 解压对应的zip包
unzip onlinemodels-python.zip 
# 运行jar包
nohup java -jar scoring.jar > out.file 2>&1 &
demo走一遍

# 从一个容器中拷贝文件到本地
docker cp 92b8d7d51979:/conf/pseudo-distributed.ini ./pseudo-distributed.ini

# 使用加速镜像进行下载
./docker pull teradatalabs/cdh5-hive --registry-mirror=https://f8up***.mirror.aliyuncs.com 

//通过镜像来运行容器并指定别名并且将容器中的端口随机映射到外部(运行命令)
docker run -d --name hadoop-master -P -h hadoopp-master teradatalabs/cdh5-hive

# 设置容器的环境变量并启动
docker run -d -P -e DEPLOY_ENV="dev" d5729c256c0b

docker exec -it 92b8d7d51979 bash	//进入一台容器的命令行界面

winpty docker exec -it 92b8d7d51979 bash //在mingw中登入一台虚拟机并且运行命令

docker-machine.exe ssh default //登入一台虚拟机并且运行命令

# 查看当前 docker 信息(包括加速镜像信息)
docker info

# 避免 git bash 使用windows命令乱码的方法,在命令前面加上 winpty
# 如直接使用 ping www.baidu.com 的话有些字符由于字符集不同导致乱码
# 但如果使用 winpty ping www.baidu.com 的话就会正常显示了

# 操作 容器的命令
docker container 
# 查看容器当前的运行状态
docker container stats
# 查看当前容器的详细信息
docker container inspect 
# 操作镜像的命令
docker image 3e5373a7ba55
# 检查 docker 镜像的的信息
docker image inspect ajoifaewf9w0
# 运行jar包
nohup java -jar -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+DisableExplicitGC -XX:+UseCompressedOops -XX:+DoEscapeAnalysis -XX:MaxTenuringThreshold=10 -verbose:gc -Xloggc:/scoring/logs/gc.log -XX:+PrintGCDetails scoring.jar > out.file 2>&1 &
# 构建docker镜像!
# docker build -t(tag) [构建者名称/镜像名称:版本名称]|[镜像名称:版本名称] 指定dockerfile 指定构建目录
docker build -t python:xgb -f /root/onlinemodels-python/Dockerfile /root/onlinemodels-python/

docker build -t python:xgb .
# 查看所有的容器(包括正在运行当中的和已经停止了的)
docker ps -a -q
# 停止所有容器
docker stop $(docker ps -a -q)
# 运行一个镜像 并且执行命令
docker run -d -p 28080:8080 python:xgb
# 解压对应的zip包
unzip onlinemodels-python.zip 
# 运行jar包
nohup java -jar -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+DisableExplicitGC -XX:+UseCompressedOops -XX:+DoEscapeAnalysis -XX:MaxTenuringThreshold=10 -verbose:gc -Xloggc:/alidata1/admin/scoring/logs/gc.log -XX:+PrintGCDetails scoring.jar > out.file 2>&1 &
demo走一遍

docker cp 92b8d7d51979:/conf/pseudo-distributed.ini ./pseudo-distributed.ini	//从一个容器中拷贝文件到本地

./docker pull teradatalabs/cdh5-hive --registry-mirror=https://f8upif7d.mirror.aliyuncs.com //使用加速镜像进行下载

//通过镜像来运行容器并指定别名并且将容器中的端口随机映射到外部(运行命令)
docker run -d --name hadoop-master -P -h hadoopp-master teradatalabs/cdh5-hive

docker exec -it 92b8d7d51979 bash	//进入一台容器的命令行界面

winpty docker exec -it 92b8d7d51979 bash //在mingw中登入一台虚拟机并且运行命令

docker-machine.exe ssh default //登入一台虚拟机并且运行命令
# 启动当前已经退出的容器并且进终端
winpty docker start -it 92b8d7d51979 

关于 Docker 的密码设置问题

通常情况下,推荐使用 docker-machine ssh default 进行登录,不需要输入密码。default 是默认的 machine 的名字。
在 boot2docker 中,默认的用户名和密码是:

user: docker
pass: tcuser

登录方法:

$ ssh docker@localhost -p 2022
docker@localhost's password: tcuser
                        ##        .
                  ## ## ##       ==
               ## ## ## ##      ===
           /""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
           \______ o          __/
             \    \        __/
              \____\______/

docker port 命令可以让我们快捷地查看端口的绑定情况.

docker port adoring_stonebraker 5000

docker port docker查看端口绑定命令
adoring_stonebraker 容器名字
5000 要查询的容器内的端口
返回结果

# 容器端口映射到对应主机端口的信息
127.0.0.1:5001

默认使用pull直接从网上拉取镜像的话会从官网上拉取镜像,由于镜像源在国外,导致拉取镜像的速度比较慢,这时可以使用下面的配置指定镜像源:

./docker pull teradatalabs/cdh5-hive --registry-mirror=https://f8up****.mirror.aliyuncs.com //使用加速镜像进行下载
docker run --name mysql -p 12345:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql

-p将主机端口映射到容器端口
12345主机端口
3306容器端口
-e MYSQL_ROOT_PASSWORD=123456设置环境变量
-d以守护进程的方式运行

关闭 docker-machine

# 创建 Docker
# 关闭default docker 虚拟机
docker-machine stop default
# 重启 docker-machine 虚拟机
docker-machine restart default
# 启动ssh打开docker-machine虚拟机终端
docker-amchine ssh default
# 删除 docker-machine 虚拟机
docker-machine rm default

Docker pull 报错 error during connect
错误原因猜测:可能和环境变量有关系

解决方案:
# 在 cmd 命令下执行,重新部署和docker相关的环境变量
@FOR /f "tokens=*" %i IN ('docker-machine env default') DO @%i

Docker 拉取私服镜像源失败解决方法:

[Error] server gave HTTP response to HTTPS client

Docker 私有仓库,pull镜像报错

Insecure registry setup not clear for Docker Machine

如何修改Windows上Docker的镜像源

Docker ToolBox解决 http: server gave HTTP response to HTTPS client问题

Unable to query docker version

error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.28/version: open //./pipe/docker_


设置私有的镜像源(不能用):

docker-machine create --engine-registry-mirror=192.168.291.133:5000 default

这里不能使用的原因是该地址不是一个合法的镜像仓库导致的,在设置加速镜像的时候一定要确保加速镜像是可用的,否则docker并不会在创建 docker-machine过程中爆出错误,而是在docker pull 命令拉取镜像的时候爆出一堆问题.

# 阿里的镜像加速器
docker-machine create --engine-registry-mirror=https://f8u****.mirror.aliyuncs.com -d virtualbox default
# docker 重新生成证书
docker-machine regenerate-certs

Docker 中国官方镜像加速

# 我遇到这个问题的原因是我设置了错误的加速镜像仓库导致的
# 这个地方就比较坑,这里不论你设置了什么加速镜像,docker都会为你创建一个 docker-machine 但是不会报错,只有 docker-machine 创建好了以后才会报一个证书错误的问题.
docker-machine create --engine-registry-mirror=https://dfasd.mirror.aliyuncs.com -d virtualbox default
Error creating machine: Error running provisioning: Unable to verify the Docker daemon is listening: Maximum number of retries (10) exceeded

一个错误的 docker-machine 虚拟机会给你带来多大的麻烦是你这个入门级选手想像不到的.不要随便设置加速镜像,哪怕你的初衷是能够实现快速的下载,但最终的结果会发现事与愿违.它只会给你带来一堆你解决不了的问题.

如何正确的使用 Docker Toolbox

  1. 下载并且安装 Docker Toolbox.
    可以使用 docker quick start 终端命令行快速启动默认的docker-machine default,但事实上发现,这样并不是最快的启动方法.相反,docker在最初启动的时候会去国外的github网站上下载一个名为 bootdocker 的镜像,再几次尝试手动下载这个镜像以加快启动速度后放弃了这个想法.刚开始学习的时候最好别尝试手动下载这个镜像了,网上其他地方提供的镜像会有过时的问题,而docker发现镜像过时后会拒绝使用该镜像并且会转到源镜像地址下载
  2. 使用 docker-machine create default 创建一个默认的 docker 虚拟机
  3. 使用提供的私有仓库地址下载镜像如
    docker pull 192.253.6.120:5000/env/jdk8

这个过程中间可能会报一个错误:

error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.28/version: open //./pipe/docker_

这是由于系统的环境变量和docker-machine虚拟机内部部分环境变量不一致导致的问题.修复方法如下,在cmd命令行下执行:

解决方案:
# 在 cmd 命令下执行,重新部署和docker相关的环境变量
@FOR /f "tokens=*" %i IN ('docker-machine env default') DO @%i

Docker ToolBox解决 http: server gave HTTP response to HTTPS client问题

server gave HTTP response to HTTPS client 问题

这是由于返回的是 http 响应而docker 默认使用的是 https 客户端导致的.默认使用 https 客户端进行请求而不是 http请求是docker做的一个连接安全的措施.这里由于需要请求不安全的镜像仓库,所以需要单独的将通过http请求访问的镜像地址单独加一下白名单.

docker-machine ssh default
cd /var/lib/boot2docker
vi profile
EXTRA_ARGS='
--label provider=virtualbox
--insecure-registry 192.168.192.161:50002

'
CACERT=/var/lib/boot2docker/ca.pem
DOCKER_HOST='-H tcp://0.0.0.0:2376'
DOCKER_STORAGE=aufs
DOCKER_TLS=auto
SERVERKEY=/var/lib/boot2docker/server-key.pem
SERVERCERT=/var/lib/boot2docker/server.pem

在 profile 中EXTRA_ARGS标签的子标签label provider后面添加 insecure-registry 将请求的url 地址加入到白名单中,这样就可以正常下载了.

# 搜索当前都有哪些镜像
λ docker search jdk
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
jboss/base-jdk 65 [OK]
fabric8/java-jboss-openjdk8-jdk Fabric8 Java Base Image (JBoss, OpenJDK 8) 26 [OK]
codetroopers/jenkins-slave-jdk8-android 25 [OK]
fabric8/java-alpine-openjdk8-jdk Fabric8 Java Base Image (Alpine, OpenJDK 8, … 17 [OK]

启动 Docker 容器的终端

# 相当于在容器中执行了bash 命令并且将当前命令行的输入和输出附到当前命令行上
docker exec -it 143rqeqwer /bin/bash
# 使用 docker attach 将容器的输入输出附到当前终端上
docker attach

使用Docker Toolbox 学习docker

在 Windows 上使用 Docker Toolbox 学习 Docker 真的好难啊,因为架构不同.遇到了好多坑.
基本架构:

虚拟机
输入
ssh 通讯
Windows系统
VirtualBox 虚拟机
docker-machine
docker 命令
镜像1
容器1
容器2
容器...
镜像2
镜像...

主体的架构大概是这样:

主机
宿主机:VirtualBox:docker-machine
docker

我们在调用 Windows 上面的 docker 命令时,实际上是在调用宿主机(VirtualBox)上的 docker 命令.从而导致了有些地方和我想象的不一致.
比如修改默认的镜像加速源,在Linux系统上修改镜像加速源的方式一般是修改一个配置文件即可,但是在 Windows 系统上无法使用.只能在创建Docker宿主机的时候指定镜像源(当然在创建以后进入到宿主机内部修改配置文件也可以,但是比较麻烦.):

# --engine-registry-mirror 指定了对应的镜像加速源
docker-machine create \
--engine-registry-mirror=https://f8u****.mirror.aliyuncs.com \
-d virtualbox default

# 通过 docker-machine inspect default 查看创建的宿主机的信息
docker-machine inspect default

另外一个比较坑的地方就是在需要向容器内挂载相应的主机目录时,需要首先将响应的目录挂载到宿主机docker-machine当中,然后才能挂载到容器当中

# 在创建宿主机 docker-machine 的时候挂载主机中的目录
docker-machine create \
--engine-registry-mirror http://hub-mirror.c.163.com \
--virtualbox-share-folder "D:\WorkSpace:/d/WorkSpace" \
default
# 在创建并运行容器的时候挂载宿主机的目录
docker run -i -v "/d/WorkSpace:/home/spacevim/work" \
spacevim/spacevim
# 或者以下命令
winpty docker run -it \
-v /home/docker/work:/home/spacevim/work \
spacevim/spacevim /bin/bash

需要注意的是,当主机的目录没有被挂载到宿主机 docker-machine 上,而在创建容器的时候想要挂载宿主机的相应的目录时,只会在宿主机上面创建一个空的目录.

你可能感兴趣的:(日常编程)