---
# System prepended metadata

title: 架設docker環境
tags: [docker]

---

---
title: 架設docker環境
tags: docker, ssh, filezilla, 檔案傳輸, dockerfile, 
---


系統採用 Ubuntu 16.04

## 功能需求
想在家透過ssh連進某台伺服器，傳入指定檔案，在指定的Docker環境中工作。

## Docker
- 建置docker環境
    - `sudo apt-get -y install docker.io`
- 如果你覺得每次指令都要打 sudo 你可以 `sudo usermod -aG docker 你的user名`
- Dockerfile [參考](https://docs.docker.com/engine/examples/running_ssh_service/)
    - 一次把 pyenv、ssh 與所需的套件全部一起裝
    ```
    FROM ubuntu:16.04
    #更新apt-get 與下載所需的套件
    RUN apt-get update && apt-get install -y openssh-server git libffi-dev \
    make build-essential python-dev python-pip libssl-dev zlib1g-dev \
    libbz2-dev libreadline-dev libsqlite3-dev curl vim
    
    #透過curl下載pyenv
    RUN curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
    # 上面下載完安裝完後會跳出幾行資料給你 這幾行我們在下面有 不確定未來版本變動會不會更改
    
    #自行創建sshd資料夾
    RUN mkdir /var/run/sshd
    
    # 設定密碼
    RUN echo 'root:這邊放你的密碼' | chpasswd
    RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
    
    RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

    ENV NOTVISIBLE "in users profile"
    RUN echo "export VISIBLE=now" >> /etc/profile
    RUN env | grep = >> /etc/environment
    
    #將該加入的環境變數放入~/.bashrc中
    RUN echo export PATH="~/.pyenv/bin:$PATH" >> ~/.bashrc
    RUN echo 'eval "$(pyenv init -)"' >> ~/.bashrc
    RUN echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
    
    #開啟ssh 預設開放的 22port
    EXPOSE 22
    #啟動這個這樣ssh才能持續連進來
    CMD ["/usr/sbin/sshd", "-D"]
    ```
    - build & run
        - `docker build -t 你image的名字 .`
        - `docker run -i -P image的名字`  有可能會當掉可以直接開其他terminal 有興趣的話可以使用 -p 自行指定port mapping
            - 像這樣 docker run -i -p 30000:22 ``
        - `docker ps`查看你的 container 也能同時看到你的port mapping到了哪個port
        :::info 
        如果找不到，使用`docker ps -al` 
        然後將 stop 的 container 重新 start
        :::
        
- ssh
    - 現在你可以從其他 clint 經由 ssh 連線到這個 container 了
    - `ssh root@你的ip -p你prot mapping的port` root是Dockerfile中設定的身分
- pyenv
    - 不確定未來會用到哪個版本所以使用他
    - `curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash` 用這行把pyenv抓下來
    - 使用 vim 將以下的環境變數加入 ~/.bashrc 直接插到最底下就好
    ```
        export PATH="~/.pyenv/bin:$PATH"
        eval "$(pyenv init -)"
        eval "$(pyenv virtualenv-init -)"
    ```
    - 這樣你重開container 也不用怕 pyenv關掉了(不過要注意你的 **prot mapping** 是否有變動)
    - 輸入`pyenv`查看有沒有這個指令
    :::info 
    如果沒有這個指令
    你可以將上面那三行環境變數直接打進terminal裡面
    :::
    - `pyenv install 3.7.2`
    - `pyenv versions` 輸入這個你可以看到我們剛剛下載的 python 3.7.2
    - `pyenv global 3.7.2`
    - 查看一下`python -V`是否為3.7.2
    - 接下來就跟一般的 python 一樣了
- 檔案傳輸
    - 下載 filezilla clint端的 [官網](https://filezilla-project.org/)
    - filezilla
        - 經由這個路徑 `檔案>站台管理員>新增站台`
        - 更改傳輸協定變成 SFTP
        - 主機請輸入你的伺服器ip => 可在伺服器上使用ifconfig找
        - port 請輸入 docker mapping 的 port
        - 你的進入身分是root
        - 密碼即是你Dockerfile中所設定的
        - 設定好你就可以直接連線拉傳檔案了!!


- python 卡在2.7.14版本
    - 我首先先將本地的2.7.14移除，反正你也用不到
    - `apt-get autoremove python`
    - 用 pyenv 下載 3.6.8，然後 `pyenv global 3.6.8`
    - 用 `pyenv versions` 測試發現有正確的只到3.6.8
    - `python -V` 卻發現找不到
    - 在執行一次`export PATH="~/.pyenv/bin:$PATH"`
    - 這個時候 `python -V` 即可抓到正常版本


- python 編碼問題
    :::warning 
    `UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)`
    :::
    - pyenv 下載了 3.6.8 正常hello world 能跑，但中文字進去卻跟你說編碼錯誤，使用下面這段code去測試
        :::info
        import sys
        print(sys.getdefaultencoding())
        print(sys.stdin.encoding)
        print(sys.stdout.encoding)
        print(sys.stderr.encoding)
        :::
    - 結果是 ![](https://i.imgur.com/ZKGvtsJ.png =250x)

    - 輸入`export PYTHONIOENCODING=utf-8`
    - 即可解決中文輸入問題
    - 在側一次剛剛上面的code
    - ![](https://i.imgur.com/EqKFAXq.png =250x)
    - 復原方法 `unset PYTHONIOENCODING`




----
#### 剩餘問題

- 了解docker container stop後 Dockerfile 中的 ENV 失效
- 了解為何filezilla 可以傳檔但 scp 卻不行permission denied




http://10.0.0.220:3000/Ww_hOqiIQZq9pNeX8l7EHw#