linux docker创建容器教程

目录

0.docker安装

1.docker镜像和容器区别:

2. 拉取镜像:

3. 运行镜像,即->开启容器:

4. docker内上网:

5. 安装各种软件:

6. 通过pycharm远端连接docker内虚拟环境

7. 打包(镜像 tar 迁移)

8. 一些建议

9. nginx配置踩坑(用 nginx 搭建文件下载服务器)

10. Dockerfile文件构建镜像


0.docker安装

直接看官网教程:docker ubuntu安装官方教程链接,很详细!docker已经支持gpu,直接看官网的教程很简单了,不用像之前那么复杂!!!

docker想用gpu,还要安装nvidia-docker2官网安装教程链接,需要科学上网,只要复制下图内容执行,然后 sudo apt-get update,sudo apt-get install -y nvidia-docker2 即可!

1.docker镜像和容器区别:

镜像是本地文件,容器是正在run运行的,需要将容器 save 或者 export   或者 commit 到本地,尽量不要覆盖原来的镜像;

2. 拉取镜像:

docker pull ***镜像

docker images

docker ps -a

docker stop Container_Name 停止容器

docker rm Container_Name 删除容器

3. 运行镜像,即->开启容器:

docker run --runtime=nvidia -v /home:/home -v /mnt:/mnt -w /home/leilei -it --entrypoint bash -p 4444:22 -p 3333:3389 -d --name cuda8.0-leilei -h pytorch0.3.1 --shm-size 32G nvidia/cuda:8.0-cudnn5.0-devel-ubuntu16.04

命令参数解析:

--runtime 运行环境,nvidia代表可以使用显卡(特别注意:这里前提必须安装nvidia-docker2),也可更改成 --gpus=all 参数

-v 目录映射(宿主机目录绝对路径:容器目录绝对路径),共享目录; /root就是用户目录,cd->pwd就可以得到;(可多次使用) 此处是挂载数据卷

-w 工作目录,进入docker时默认的路径,但不一定是/root,直接cd,再pwd,可以看到/root

-it 进入docker之后命令行交互

--entrypoint 进入docker之后运行的命令

-p 开放端口,便于外部远端访问(4444是开放的外部端口,22默认是docker内的端口,尽量不变)

-p xxxx:3389:3389端口是Server远程桌面的服务端口,可以通过这个端口,用"远程桌面"等连接工具来连接到远程的服务器

--name 给docker容器的命名

-h 给容器主机名hostname命名

-d 后台运行

nvidia/cuda:8.0-cudnn5.0-devel-ubuntu16.04 镜像名字(REPOSITORY:TAG)

注:一定要显式数据卷-v,不会增加内容,缓存随着容器消失而消失!

注意:必须进入容器内,才可以操作,例如nvcc -V等操作,全部默认基于进入容器内!

docker start cuda8.0-leilei 开启容器

docker exec -it cuda8.0-leilei bash 进入容器 以命令行形式

docker stop 容器名 关闭容器

docker rm 容器名 删除容器

若想使用win下面的远程桌面,需要在docker容器内安装 ubuntu-xrdp,并且设置端口号3389,这样才可以使用!!!

4. docker内上网:

【linux 建议ip命令修改查看网络设置】

若服务器有网,容器会自动有网的,此小步骤可略过!这里是笔记本连接无法上互联网的服务器!

首先在本地笔记本电脑上:docker pull dannydirect/tinyproxy 拉取镜像

然后docker run -d --name='tinyproxy' -p <Host_Port>:8888 dannydirect/tinyproxy:latest <ACL> 允许容器

--eg:docker run -d --name='tinyproxy' -p 6666:8888 dannydirect/tinyproxy:latest ANY

再就是 后面的步骤了

---------------------------------------------------------------------------

cd /root

修改.bashrc,添加环境变量(可采用sed -i 'N;4a\export http_proxy=http://<your_ip>:6666' .bashrc命令直接修改)

删除第N行  sed -i 'Nd' filename

若是不知道ip,win下面cmd ipconfig,无线局域网适配器 WLAN IPV4地址

export http_proxy=http://<your_ip>:6666

export https_proxy=http://192.***:6666

source .bashrc

修改apt源:不同版本的ubuntu apt源:点击查看

编辑/etc/apt/sources.list(尽量不能换行)

deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse

'''
注意点:
    ubuntu不同版本有不同的代号,
    ubuntu16.04的代号:xenial,ubuntu18.04的代号:bionic,替换相关单词即可
    查看当前ubuntu版本代号命令: cat /etc/*-release  即可看到 VERSION_CODENAME=xenial
ubuntu版本库链接:
    https://releases.ubuntu.com/
'''

先rm -rf /etc/apt/sources.list.d(下载速度变快,找不到nvidia源和cuda源),再apt-get update

再 apt-get upgrade 更新软件

5. 安装各种软件:

此处单独:(若安装python3.6,请看这里,直接apt-get install python3.6报错,记住直接下载源码编译 最好,先安装依赖环境)

1. python官网下载Gzipped包 Python Source Releases | Python.org

2. 复制到docker容器内 docker cp /**/Python-3.6.8.tgz cuda8.0-leilei(容器名):/root/

3. 逐步执行命令:

    (0) 安装python的依赖环境:【apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl libopencv-dev】

    (1) tar -xzf Python-3.6.8.tgz

    (2) cd python-3.6.8 ; 再执行 ./configure 默认安装/usr/local/bin中,也可指定安装路径,./configure --prefix /home/leilei/python

    (3) make

    (4) make install

4. which python3   usr/local/bin/python3.6.8  【docker容器内都是 usr/local/bin/】

5. 建立软连接: ln -s /usr/local/bin/python3.6 /usr/local/bin/python 

ln -s /usr/local/bin/pip3 /usr/local/bin/pip

#只有先安装python的依赖环境,再安装python3.6,那么python3.6自带python3.6-pip。#

更换pip源:cd (/root 可省); mkdir .pip ; touch pip.conf ; vim pip.conf 将下面3行复制进去

[global]

index-url = http://mirrors.aliyun.com/pypi/simple

trusted-host = mirrors.aliyun.com

docker内配置中文编码环境(若遇不到跳过)

1.locale -a 是否有 C.UTF-8

2.编辑(vim) /root/.bashrc,添加环境变量

export LANG=C.UTF-8

export LC_ALL="C.UTF-8"

export LANG="C.UTF-8"

export LANGUAGE="C.UTF-8"

source .bashrc

即可!

##########################################################################

6. 通过pycharm远端连接docker内虚拟环境

# docker 命令 加入 -p参数

进入docker内执行如下命令:

apt-get update

apt-get upgrade

apt-get install openssh-server

修改ssh文件:vim /etc/ssh/sshd_config : PermitRootLogin prohibit-passwd 改为 PermitRootLogin yes

重启ssh:/etc/init.d/ssh restart

设置docker密码: 命令行执行 passwd 设置密码

pycharm远端连接docker内环境:(将端口号修改成4444即可,用户名默认root,再输入密码即可,找到)

docker内执行which python:将路径直接复制到pycharm里面虚拟环境;然后映射也映射到你的共享目录中某个文件夹

pycharm连接到远端请参考:Pycharm 远端同步设置(SSH Interpreter)_LEILEI18A的博客-CSDN博客

7. 打包(镜像 tar 迁移)

docker commit container_id image_name:tag  #将容器转成镜像

docker save image_id -o /somepath/image_name.tar  # 压缩

8. 一些建议

(1) 尽量采用dockerfile 进行build,有build历史

(2) 尽量采用docker-compose.yml设置; 此处是docker-compose.yml的相关介绍,与docker run命令一一对应注释

# docker-compose.yaml

version: '2.4'

services:
  nginx:
    image: nginx:1.17.0
    build: 
      context: .
      dockerfile: ./nginx.dockerfile
    ports:
      - "3322:80"
    volumes:
      - "./nginx.conf:/etc/nginx/nginx.conf"
      - "/home/my_dockers/1_download:/usr/share/nginx/files"
    networks: 
      - aiservice
  # -d 后台运行是在外面设置, docker-compose up -d
  ai:  # 注:1-当存在镜像与image名字相同时,不会build;2-当image与所有镜像名字不同时,开始build镜像;3-当dockerfile中FROM镜像不存在时,pull拉取镜像
    image: nvidia/cuda:10.2-cudnn7-devel-ubuntu16.04-lei  # REPOSITORY:TAG;
    runtime: nvidia  # --runtime
    build:  # build 根据dockerfile文件在image镜像上进行搭建镜像,而非容器!
      context: .  # 上下文,使用相对路径
      dockerfile: ./ai.dockerfile
      args: 
        http_proxy: http://:6666           # 连接外网
        https_proxy: http://:6666          # 连接外网
        index_url: http://mirrors.aliyun.com/pypi/simple  # 阿里源
        trusted_host: mirrors.aliyun.com                  # 阿里源
        resources_url: http://:3322           # nginx反向代理,将下载的软件包放置此处
    ports:  # -p 端口号
      - "4466:22"
    volumes:  # -v 数据卷
      - "/home:/home"
    working_dir: /home/leilei # -w 工作目录
    container_name: cuda102-leilei  # --name 容器名
    hostname: lei    # -h 容器主机名
    stdin_open: true # -i -it命令交互
    tty: true        # -t -it命令交互
    privileged: true  # 一般尽量开启,是真root权限
    # entrypoint: #?bash --entrypoint; 不用写,直接进入后就是bash
    shm_size: 32gb  # --shm_size 一般在build外面,build是构建镜像,而非容器,所以没有网络
    # restart: always # 指定容器退出后的重启策略为始终重启
    depends_on:  # 依赖,若构建此镜像-运行容器,需要先进行 depends_on中的服务
      - nginx                       # version3用法https://docs.docker.com/compose/startup-order/, 未看懂
        # condtion: service_started  # 待nginx服务起来后,才进行当前ai镜像构建-容器运行;version3不再支持!
    networks: 
      - aiservice

networks:  # 当只有1个宿主机时,运行的几个容器就是1个局域网,也可以根据networks分开组成不同的局域网
  aiservice:  # 可为空,即为默认值none
# nginx.conf; 采用neinx搭建文件下载服务器(反向代理);此文件不需要修改
user root;
worker_processes 1;
events {
  worker_connections 1024;
}
http {
  server {
    listen 80;
    server_name your.domain.com;
    charset utf-8; # 设置编码格式
    root /usr/share/nginx/files;
    location / {
        autoindex on; # 开启索引功能 !!!最重要 !!!
        autoindex_exact_size off; # 关闭计算文件确切大小,只显示Mb kb gb
        autoindex_localtime on; # 显示本机时间而非 GMT 时间
    }
  }
}
FROM nvidia/cuda:10.2-cudnn7-devel-ubuntu16.04
# ai.dockerfile
# 构建时连接外网, ARG在docker-compse中build中 必须声名
ARG http_proxy
ARG https_proxy
# 构建时设置阿里源
ARG index_url
ARG trusted_host
# 将一些包下载好,并通过nginx反向代理
ARG resources_url
# 更换apt阿里源
COPY ./sources.list /etc/apt/

# ENTRYPOINT [ "executable" ]
RUN bash -xc "rm -rf /etc/apt/sources.list.d"

# 安装python依赖,以及一些其它的包
RUN apt-get update && \
    apt-get install -y make build-essential libssl-dev zlib1g-dev \
    libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
    libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev \
    liblzma-dev python-openssl libopencv-dev tmux vim && \
    apt-get clean

RUN bash -xc "curl -O ${resources_url}/Python-3.8.2.tgz && \
    tar -xzvf Python-3.8.2.tgz && \
    cd Python-3.8.2 && \
    ./configure && make && make install && \
    cd .. && rm -rf Python-3.8.2.tgz Python-3.8.2 && \
    ln -s /usr/local/bin/python3.8 /usr/local/bin/python && \
    ln -s /usr/local/bin/pip3 /usr/local/bin/pip && \
    pip install --upgrade pip -i ${index_url} --trusted-host ${trusted_host}"

# 安装 python 某些库
RUN bash -xc "pip install -r requirements.txt -i ${index_url} --trusted-host ${trusted_host} && \
    rm -f requirements.txt && \
    mkdir /root/.pip/"
# 设置pip阿里源
COPY ./pip.conf /root/.pip/

# 更改支持ssh, passwd, 以及需要的一些python库

9. nginx配置踩坑(用 nginx 搭建文件下载服务器)

  1.  docker run对应的命令,-it -name 等均可在docker-compose.yml中找到,已经做了注释;
  2.  nginx反向代理显示文件列表,通过nginx.conf实现,用于http快速下载安装包,在docker-compose.yml中nginx已经设置好[参考博客]
  3.  所有注意事项均已在docker-compose.yml文件注释,参考 “ai”部分

注:(此处列举重要的点,其它点基本上都在yml文件中注释了)

docker-compose.yml中

  • image镜像若存在,不执行build-dockerfile文件(此处踩坑);

  • image不存在时,执行build搭建镜像;

  • 当dockerfile FROM镜像不存在时,pull拉取镜像;

使用命令【郑重提示:现在不推荐使用apt-get install docker-compose,建议看官网的文档,有3种方法,1种是二进制包,从github release处下载,直接pip安装;另1种是apt-get install docker-compose-plugin的方式,安装docker engine时就安装了这个;再1种是docker desktop;

“官方命令都采用docker compose”,没有“-”,详情看官网文档即可】

  • docker-compose up -d 创建容器(后台运行)

  • docker-compose ps 列举个人创建的容器

  • docker-compose stop 停止容器

  • docker-compose rm 删除所有容器

10. Dockerfile文件构建镜像

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐