handling kolla conatainers remotely with pycharm docker tools

# 목표
the goal

이런 화면을 만들어 보자.
is to make an environment like this:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/e566138c-9188-c016-11ee-11911e93c34d.png)

# 과정
Procedures

## 가상머신 쪽 설정
virtual machine side setting

기본 개념은 docker daemon과 tcp연결이다. unix socket 연결을 default로 하지만, tcp socket으로 연결 할 수도 있다.

the basic concept is using tcp connection with dockerd whose default setting is unix socket file.

reference:
https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-socket-option

Windows나 Mac이라면, 다음과 같은 설정 화면도 있다.
if you are a PC or Mac user, you can expose tcp connection with setting dialog.

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/3a716ef0-6aec-bcf8-daf7-dfdec8c8d922.png)


여기에서는 암호화 없이 사용하지만, 실제로는 보안을 위해 암호화 설정이 필요하다. 다음 레퍼런스를 참조.
though I'm using it without TLS settings, you would need TLS setting for security actually.

reference 
https://success.docker.com/article/how-do-i-set-the-docker-daemon-options
https://qiita.com/matyapiro31/items/cf5f436c40a6f77227c3
https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file

이건 내가 실행한 명령.
this is what i did

```
# listen using the default unix socket, and on 2 specific IP addresses on this host.

$ sudo dockerd -H unix:///var/run/docker.sock -H tcp://150.95.32.xxx
```

kolla-ansible이 설치된 virtual machine centos에서 실행한_화면.
and this is the result.

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/ed788c43-e324-f5f6-c419-7cd74c18ee94.png)

이렇게 소켓연결을 할 수 있게 설정하면, 연결이 허용된 외부 머신에서 다음과 같은 커맨드가 가능하다. 

how you can use docker client from a remote machine like this:

``docker -H tcp://kolla-machine:2375 ps``



## Pycharm 쪽 설정
pycharm side setting

jetbrains.com reference

https://www.jetbrains.com/help/pycharm/using-docker-as-a-remote-interpreter.html

'Docker for Windows' 설치부터 시작한다.
from installing 'Docker for Windows'

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/bb2cde98-b32b-3b43-2a82-b8cfcf1f5f16.png)

나는 dockerd는 사용하지 않을 것이기 때문에 Cancel을 선택한다.

choose 'Cancel' if you want to use docker client only.

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/28d39661-79f6-3a42-e3a4-9eb1f8d201b1.png)

``set DOCKER_HOST=<kolla-ansible vm>:2375``

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/737cde01-6a53-50cb-95a4-af85f9fd42d9.png)

horizon container의 /var/lib/kolla 를 windows 의 C:\horizon-container-var-lib\kolla 에 복사했다.

use ``docker cp`` command to copy from horizon:/var/lib/kolla to C:\horizon-container-var-lib\kolla

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/6e21a59a-f06e-c917-9ec8-644f51f8d558.png)

프로젝트를 만들고, 
made a pycharm project,

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/b3228e7f-1bd4-0c3a-f035-3c33750f4cde.png)

프로젝트 설정에서 다음과 같은 Docker 설정이 가능하다.
set Docker connection

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/3fe11f88-abb9-c84c-a256-2a476b75b052.png)

pycharm에서는 다음과 같이 remote interpreter설정이 가능하다. 
and docker remote interpreter.

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/736c8593-921a-413e-7201-073816dd1ddd.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/06f7f57e-f76f-35ea-ffbb-e34fdf6614a6.png)

서비스는 또 horizon을 선택했다.
chose horizon service

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/fdf2a662-7e12-2f14-8df2-0e7be46237c8.png)

OK를 누르면 다음과 같이 연결을 시도한다.
pressed OK and it tried connection.

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/63a6ad17-a255-0233-6ed2-ae15339e146e.png)

그 다음 path mapping
next step, path mapping

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/d01f3033-34d9-d21b-e8a5-cc1cd2a64b68.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/fb2535a4-c14f-9032-4ccf-2a9eae427bf0.png)


local horizon container code path:
c:/miniconda3/envs/openstackclient/projects/horizon/horizon

docker horizon container code path:
/var/lib/kolla/venv/lib/python2.7/site-packages/horizon


remote interpreter connection success screen

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/3ec29811-acb7-0170-f586-1362ddd6d1ed.png)

docker container안에 있는 package도 읽어 온다.

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/f59e3ed2-7211-fa36-345e-b466dcc229b7.png)

docker panel이 보이고, 패키지 정보를 파싱하기 시작한다.
as docker panel is shown, and parsing packages started

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/2f8d8ee9-7fd7-97b8-e12e-3aad7e32a6f0.png)

파싱이 완료되면, CentOS의 Docker 서버의 내용을 이렇게 remote로 볼 수 있다. 
when parsing finished, I can see docker server information remotely like this:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/7450e058-8187-ba9a-f639-2c7fbca7e70d.png)

container의 프롬프트에 직접 연결할 수도 있다. container를 선택하고 popup 메뉴에서 Exec를 선택하면 /bin/bash를 실행할 수도 있다.

you can open container prompt by click 'Exec' of container's context menu

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/f13b1eef-d643-7edd-fa94-3bb7c6c0cf4f.png)

that's it.