纲领

  • 前言
  • 使用
  • 过程
  • 配置
  • 总结

前言

随着docker的普及,现在更多的生产线上的程序都是打包成docker 应用,这样方便环境的隔离,也能提高资源的利用率,不过一旦出了问题,怎么debug就成了一个难题,我可暂时没有学会大神们的pdb debug大法,只会用pycharm 打断点调试,那如何处理呢,pycharm professional (只有这个版本里面有这个功能,社区版是没有的) 有一个remote debug 功能,如果我们使用这个功能,那是不是可以同样套路上docker 应用呢?当然可以,我们姑且将docker 当成一个真实的机器

准备

  • docker
  • pycharm professinal
  • docker-compose
  • ubuntu 16.04 系统

使用

最近我正在改nvidia 官方的一个可视化机器学习的web框架 digits ===> https://github.com/NVIDIA/DIGITS(可以轻松的训练) 本次操作就以它来演示

准备基础镜像

因为官方已经提供了他的官方镜像,所以我们直接拉镜像就可以了

sudo docker pull  nvidia/digits:5.0

准备debug相关资料

新建一个debug 文件夹

mkdir debug_wukong 

debug_wokong下新建 Dockerfile

FROM nvidia/digits:5.0
RUN apt-get update
RUN apt-get -q -y install openssh-server python-pip python-tk build-essential python-dev
RUN mkdir /var/run/sshd
RUN sed "s/without-password/yes/g" /etc/ssh/sshd_config > /etc/ssh/sshd_config2
RUN cp /etc/ssh/sshd_config2 /etc/ssh/sshd_config
RUN echo 'root:root' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

WORKDIR /workspace

ENTRYPOINT /usr/sbin/sshd && bash
EXPOSE 22

准备docker-compose.yml文件

version: "2"
services:
  debug_wukong:
      build: .
      ports:
          - "8083:8080"
          - "9999:22"
      environment:
          - RUNENV=production

这里,我们将应用的端口暴露出来,宿主机的9999 与虚拟机的22端口绑定在一起了

build debug的镜像

debug_wukong 文件夹下,我们就有如下的文件了

.
|-- Dockerfile
|-- docker-compose.yml

使用命令sudo docker-compose build 耐心等待,这样我们就可以在原来的镜像基础之上生成一个新的可以debug的镜像

进入镜像

debug_wukong文件夹下,使用命令

docker-compose run --service-ports debug_wukong bash

这样我们就可以顺利的进入docker 的内部环境了,这个时候,当前的bash 已经进入到了docker 内部,我们在开另外一个bash命令窗口,使用命令docker ps -a, 可以方便的看到当前的内容

CONTAINER ID        IMAGE                                                            COMMAND                  CREATED             STATUS                      PORTS                                                    NAMES
c1f9f2174eb0        debugwukong_debug_wukong                                         "/bin/sh -c '/usr/..."   22 hours ago        Up 22 hours                 5000/tcp, 0.0.0.0:9999->22/tcp, 0.0.0.0:8083->8080/tcp   debugwukong_debug_wukong_run_1

包括我们当前起的docker 名称

当前状态

这个时候,我们的虚拟机(容器)内部端口22 (ssh) 和宿主机的9999绑定了,内部的应用端口8080和外部的8083绑定在了一起

配置

配置目录

我们使用pycharm打开我们的项目文件,(我这边的文件夹已经改成wukong了),先把菜单栏的

Tools -> Deployment -> Configration

如图所示:

  • sftp host : 我们远程debug的host地址,我这里就直接填本地了 127.0.0.1
  • port : 9999 记得我们开放的9999(实际和docker 里面的绑定的22端口了吧)
  • Root path: 映射的地址
  • User name : 我们的用户名
  • Password: 密码也是root (用户名和密码我们都已经在dockerfile里面写好了)

配置python path

菜单栏

Pycharm -> Preferences -> Project -> Project interpreter

我们选择右边的"选项图标",会出现

Add remote 

的选项,我们选择好,然后会出现如下的界面

填好我们之前的参数 ,这样就会方便的将我们的环境与远程环境同步,这个时候我们就可以方便的使用remote 的python 编译器执行我们的本地脚本了

同步本地代码到docker内部

选择upload 选项,就样就会将本地的代码同步到docker内部环境,以后修改记得同步到远程环境

补充

现在更新了一个新的ubuntu 18.04的base镜像

# Just for debug
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:root' |chpasswd
RUN sed -ri 's/^#?PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
RUN mkdir /root/.ssh
RUN apt-get clean && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

EXPOSE 22
ENTRYPOINT /usr/sbin/sshd && bash

总结

本次主要从dockerfile的制作,docker-compose 使用,以及pycharm 的配置来介绍我们的一大日常工作中的常用利器,remote debug ,学会这个技能,对于我们的工作还是有不小的帮助的。10.1 国庆节在即,大鱼在这里提前祝大家国庆快乐,出行注意安全。