整理自「开发 Tips」系列,汇总 Docker 使用与运维中的常见问题与解决方法。
1. Docker Machine 基本操作命令
1
| docker-machine create --driver virtualbox my-vm-name
|
1
2
3
4
| docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default * virtualbox Running tcp://192.168.99.101:2376 v18.06.1-ce
my-vm-name - virtualbox Running tcp://192.168.99.102:2376 v18.06.1-ce
|
1
2
| docker-machine ssh default
docker@default:~$
|
1
2
| docker-machine ip default
192.168.99.101
|
1
| docker-machine [命令] [主机名]
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| active 查看活跃的 Docker 主机
config 输出连接的配置信息
create 创建一个 Docker 主机
env 显示连接到某个主机需要的环境变量
inspect 输出主机更多信息
kill 停止某个主机
regenerate-certs 为某个主机重新生成 TLS 认证信息
restart 重启主机
rm 删除某台主机
ssh SSH 到主机上执行命令
scp 在主机之间复制文件
start 启动一个主机
stop 停止一个主机
upgrade 更新主机 Docker 版本为最新
url 获取主机的 URL
|
2. 在 Docker Machine 安装软件
在 Windows 或 OS X 上,使用 Docker 需要借助 VirtualBox 基于 Boot2Docker 镜像创建的虚拟机。Boot2Docker 基于 Tiny Linux,提供 tce-load 管理包工具。
以安装 Python 为例:
1
2
| tce-load -wi python
curl https://bootstrap.pypa.io/get-pip.py | sudo python -
|
可安装软件包列表 tce-load:
http://distro.ibiblio.org/tinycorelinux/tcz_2x.html
tce-load 命令的文档:
http://wiki.tinycorelinux.net/wiki:tce-load
3. Docker 命令
- 启动容器,映射端口格式: hostPort:containerPort
1
2
3
4
5
| docker container run \
-d \
-p 127.0.0.1:8080:80 \
--name nginxname \
nginx
|
1
| docker exec -it containerID bash
|
1
| docker logs -f containerID
|
4. VirtualBox 配置 Docker 加速器
编辑 .docker\machine\machines\default\config.json 文件,新增:
1
2
3
| "RegistryMirror": [
"http://f1361db2.m.daocloud.io"
],
|
5. Docker 内部访问宿主机服务
在 Docker 中,直接使用 localhost 访问宿主机服务,报错网络不通,需要借助 docker0 。
- 在 Linux 中,查看宿主机 docker0 的 IP 地址,执行命令:
1
| docker.for.mac.host.internal
|
6. /var/lib/docker 目录迁移或扩容
1
| mv /var/lib/docker /var/lib/docker_bk
|
1
2
3
4
| mkdir -p /data/docker/
rsync -avz /var/lib/docker_bk/ /data/docker/
du -h --max-depth=0 /data/docker
ln -s /data/docker /var/lib/docker
|
7. 在 Docker 中运行 Java 项目问题
JVM 不知道运行在容器中,误将物理资源当做容器的可用资源,Java 10 才解决这个问题,
其他版本处理办法:
1
| -Xmx`cat /sys/fs/cgroup/memory/memory.limit_in_bytes`
|
1
| -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
|
参考链接:容器(docker)中运行java需关注的几个小问题
8. Dockerfile 多个 From 指令
多个 From 指令生成的镜像,以最后一个 From 为准。
多个 From 指令是为了区分不同构建阶段,比如,构建与运行环境的分离。例如:
1
2
3
4
5
6
7
8
9
10
11
| FROM golang:1.12 as controller-manager-builder
COPY / /go/src/myapp
WORKDIR /go/src/myapp
RUN CGO_ENABLED=0 GO111MODULE=on GOOS=linux GOARCH=amd64 GOFLAGS=-mod=vendor go build --ldflags "-extldflags -static" -o controller-manager ./cmd/controller-manager/
FROM alpine:3.7
RUN apk add --update ca-certificates && update-ca-certificates
COPY --from=controller-manager-builder /go/src/myapp/controller-manager /usr/local/bin/
CMD controller-manager
|
golang 镜像用于构建源码,alpine 镜像用于运行程序,两者的关联在于 COPY --from= 将二进制从一个镜像拷贝到另外一个镜像。