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,还要安装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
(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 搭建文件下载服务器)
- docker run对应的命令,-it -name 等均可在docker-compose.yml中找到,已经做了注释;
- nginx反向代理显示文件列表,通过nginx.conf实现,用于http快速下载安装包,在docker-compose.yml中nginx已经设置好[参考博客]
- 所有注意事项均已在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 删除所有容器