Please enable Javascript to view the contents

Docker 运维实践

 ·  ☕ 2 分钟

整理自「开发 Tips」系列,汇总 Docker 使用与运维中的常见问题与解决方法。

1. Docker Machine 基本操作命令

  • 创建 my-vm-name 虚拟机
1
docker-machine create --driver virtualbox my-vm-name
  • 查看全部 docker-machine
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
  • 登录到 docker-machine
1
2
docker-machine ssh default
docker@default:~$
  • 获取 docke-machine 的宿主机 IP
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
  • 以 shell 的形式登录到容器
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
ip addr show docker0
  • 在 OS X 中,可以直接使用地址。
1
docker.for.mac.host.internal

6. /var/lib/docker 目录迁移或扩容

  • 停止相关服务,保证数据一致性
1
service docker stop
  • 备份数据
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
  • 重启相关服务
1
service docker start

7. 在 Docker 中运行 Java 项目问题

JVM 不知道运行在容器中,误将物理资源当做容器的可用资源,Java 10 才解决这个问题,

其他版本处理办法:

  • java5/6/7/8u131-,添加启动参数
1
-Xmx`cat /sys/fs/cgroup/memory/memory.limit_in_bytes`
  • java8u131+和java9+,添加启动参数
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= 将二进制从一个镜像拷贝到另外一个镜像。


微信公众号
作者
微信公众号