--- 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#