Docker官网:https://www.docker.com/
Docker中文社区:https://www.docker.org.cn/
Docker Hub :https://hub.docker.com/
DevOps 开发运维
CI/CD 持续集成 持续部署
DockerHub https://www.jianshu.com/p/ab6305528af1
什么是 DockerHub 以及为什么它很重要?DockerHub 是一个由 Docker 公司运行和管理的基于云的存储库。它是一个在线存储库,Docker 镜像可以由其他用户发布和使用。有两种库:公共存储库和私有存储库。如果你是一家公司,你可以在你自己的组织内拥有一个私有存储库,而公共镜像可以被任何人使用。
你也可以使用公开发布的官方 Docker 镜像。DockerHub 上发布了数千镜像供你使用。DockerHub 作为默认存储库硬编码到 Docker 中,所以当你对任何镜像运行 docker pull 命令时,它将从 DockerHub 下载。
镜像和容器
通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。
容器是镜像的运行实例,当被运行时有镜像状态和用户进程,可以使用docker ps 查看。
大白话讲解Docker是什么?容器(动态),镜像运行实体(静态)
容器和虚拟机的区别?
虚拟机:就是模拟正泰机器包含硬件,每台虚拟机都需要自己的操作系统,虚拟机开启了,预分配资源全部被占用。
docker:和宿主机共享硬件资源及操作系统实现资源动态分配,与其他容器共享内核。
docker启动属于秒级,虚拟机启动需要几分钟
docker轻量,占用资源很少,一般一个容器才几十M
docker容器创建 删除 都是分钟的
nvidia-docker2的安装需要和你docker版本一致,因此需要查询本地docker版本
sudo docker -v
然后查询可安装的nvidia-docker2及nvidia-container-runtime
apt-cache madison nvidia-docker2 nvidia-container-runtime
查看NVIDIA-Docker版本和docker版本:
nvidia-docker version
搜索镜像:docker search
获取镜像: docker pull
查看镜像:docker images
删除镜像:docker rmi
重启docker:systemctl start docker
docker版本:docker -v
随机启动nginx 容器 随机端口 docker run -d -p 80:80 --name mynginx nginx -d表示后台运行 --name 别名
查看容器启动情况: docker ps
进入容器:docker exec -it id /bin/bash
查看日志情况:docker logs Name/ID
查看最近20行日志:docker logs -f --tail -20 id
显示一个运行的容器里面的进程信息:docker top id
停止容器:docker stop id
启动容器:docker start id
查看容器启动情况:docker ps
查询所有容器:docker ps -a
强制停止容器:docker kill id
删除容器:docker rm id
强制删除容器:docker rm -f id
查看容器日志:docker logs id
首先docker images 查看容器名称和别名
批量停止容器:docker rm -f $(docker ps -aq)
docker run -d -p 81:80 --name myngin1 nginx
查看docker的硬盘空间使用情况:docker system df
eg:
sudo docker pull ubuntu #下拉一个镜像,如果本地没有进行网上下载
sudo docker run -i -t ubuntu /bin/bash #i 交互式操作 t 代表一个终端 ubuntu:镜像名字 /bin/bash 交互式shell 指令运行后进入ubuntu终端
cd home #进入ubuntu home 目录
exit #退出这个容器
sudo docker ps #查询运行的容器
sudo docker ps -a #查询所有的容器 包括没有运行的容器
sudo start id # 启动停止的容器
sudo docker ps # 查看上条指令是否启动容器
sudo docker run -i -t -d --name ubuntu-test ubuntu /bin/bash #d 后台使用 name进行名字命名
sudo docker stop id #停止容器
sudo docker ps # 查看是否停止容器
sudo docker restart id # 重启停止的容器
sudo docker ps # 查看容器是否重启
sudo docker attach id #进入终端
exit # 退出
sudo docker ps # 查看容器状态 容器退出终止
sudo docker restart id # 启动容器
sudo docker ps # 查看是否启动 启动
sudo docker exec -it id /bin/bash #进入容器
exit # 退出容器
sudo docker ps # 容器没有终止
###########容器导出导入
mkdir ubuntu-t #创建文件夹
cd ubuntu-t # 进入文件夹
sudo docker export id > ubuntu.tar #导出
ls # 显示ubuntu.tar 导出成功
cat /ubuntu.tar | sudo docker import - test/ubuntu:v1
sudo docker images #查看镜像是否导入成功
sudo docker ps -a #查询所有镜像
sudo docker rm -f id # 删除镜像
sudo docker pull training/webapp #拉镜像
sudo docker run -d -P training/webapp python app.py #运行镜像 大写的P
sudo docker ps
sudo docker run -d -p 5000:5000 training/webapp python app.py# 更改端口号 内部5000转本地5000 小写的p
sudo docker port id #
sudo docker logs -f id #运行日志查询
sudo docker top id #查询当前进程
sudo docker inspect id #查询配置与状态信息
sudo docker stop id #停止
sudo docker images # 镜像
sudo docker search httpd#查找镜像
sudo docker pull httpd# 拉镜像
sudo docker images
sudo docker rmi httpd#删除镜像
sudo docker ps #找容器
sudo docker commit -m="update" -a="fu" bf25 ubuntu-fu:v2 #创建镜像
sudo docker images
mkdir Dockerfile # 创建镜像的另一种方法
cd Dockerfile
gedit Dockerfile
from ubuntu:18.04
run apt-get update
sudo docker build -t fu/ubuntu .#运行
若在容器中使用nvidia驱动,则需要安装nvidia-docker。(宿主机中已经安装好nvidia驱动)
宿主机手动安装与docker镜像文件中一致的nvidia驱动
安装前注意:安装nvidia-docker之前,需要先给宿主机安装nvidia驱动,docker内不需要安装驱动!
使用ppa无法获取最新驱动,因此手动安装
注:安装435版本以上
1)查看显卡信息
lspci | grep VGA
查看驱动信息
ubuntu-drivers devices
注意:如果查看驱动信息不返回结果,进行如下操作
a、加入官方ppa源:
sudo add-apt-repository ppa:graphics-drivers/ppa
b、刷新软件库的作用,下面是代码
sudo apt-get update
c、之后就可以进行再次输入:ubuntu-drivers devices
推荐下在带有recommend标志的驱动
d、我的电脑显示的安装驱动是invidia-430,因此下面我们安装这个显卡的驱动
sudo apt-get install nvidia-430 nvidia-settings nvidia-prime
e、之后记得重启一一下电脑
2)下载驱动程序:驱动地址
选择适合自己电脑的版本就可以,下载完之后是一个名称为 NVIDIA-Linux-x86_64-xxx.xx.run 的文件。
3)禁用nouveau驱动
查看是否成功禁用
只要是安装过NVIDIA显卡驱动的,nouveau一般都被禁止了。可以通过命令
lsmod | grep nouveau
查看。如果没有任何输出就是禁用成功了。否则,请参考禁用步骤。
禁用步骤
1.创建/etc/modprobe.d/blacklist-nouveau.conf
文件,你可以通过如下命令:
sudo gedit /etc/modprobe.d/blacklist-nouveau.conf
2.填入以下内容:
blacklist nouveau
options nouveau modeset=0
3.重新生成kernel initramfs
sudo update-initramfs -u
4.重启电脑
sudo reboot
4) 卸载原有驱动
sudo apt-get remove --purge nvidia*
5)ubuntu desktop驱动安装
sudo service lightdm stop
sudo ./NVIDIA-Linux-x86_64-390.77.run
sudo service lightdm start
如果提示unit lightdm.service not loaded
则先安装LightDm:sudo apt install lightdm
安装完毕后跳出一个界面,选择lightdm,再sudo service lightdm stop
6)ubuntu server版本安装
对于桌面版系统而言,需要先用sudo service lightdm stop
关闭当前图形界面。
建议装驱动前都执行以下该指令,有益无害sudo apt-get --purge remove nvidia-*
该指令能卸载驱动并不保留配置文件。
Ubuntu服务器版由于在安装系统时只装了OpenSSH server和standard system utilities,一些必备的development tool并没有安装,需要接下来手动安装。在安装驱动程序的过程中,会因为缺少gcc、g++、make等development tool而报错导致无法完成驱动程序安装(ERROR:Ubable to find the development tool ‘make’ in your path…),不用担心,手动安装这些开发包后再次执行安装指令即可。另外,安装过程中出现的弹框根据默认选项选择即可。手动安装development tool指令为:
sudo apt-get install gcc
sudo apt-get install g++
sudo apt-get install make
安装指令如下:
sudo chmod a+x NVIDIA-Linux-x86_64-384.130.run
sudo ./NVIDIA-Linux-x86_64-384.130.run -no-x-check -no-nouveau-check -no-opengl-files
在上述指令中,–no-opengl-files表示只安装驱动文件,不安装OpenGL文件,这个参数最重要。–no-x-check 安装驱动时不检查X服务。–no-nouveau-check 安装驱动时不检查nouveau(注:这个选项和1.2禁止集成的nouveau驱动组成双保险,其实一项操作就可以了)。
报错解决:
The target kernel has CONFIG_MODULE_SIG set. which means that is supports
cryptographic signature on kernel modules. On some system, the kernel may refuse
to load modules without a valid signature from a trusted key. This system also has
UEFI Secure Boot enabled; many distrubtions enforce module signature verification
on UEFI systems when Secure Boot is enabled(2). Would you like sign the NVIDIA kernel
module? (Answer: Install without signing)
Kernel module load error: Required key not avaliable
错误的简要描述了 NVIDIA 由于由于Ubuntu 16.04 的内核编译默认设置了 CONFIG_MODULE_SIG 为真, 然后Secure Boot打开所带来的问题, 更详细的描述见参考链接[2][3]. 大意是在支持UEFI的设备上打开Secure Boot 后,Ubuntu 16.04对于添加到内核的模块更加保守, 需要持有签名才能添加到模块中, 而显卡驱动由于要添加到内核中, 所以需要签名. 在安装过程中我们也会看到NVIDIA显卡会提示是否生成签名.
如果生成成功则没有问题,如果失败则进入BIOS关闭Secure Boot
对于桌面版系统而言,安装完后使用sudo service lightdm start
回到图形界面。
7)驱动安装选择选项如下:
The distribution-provided pre-install script failed! Are you sure you want to continue?
选择 yes 继续。
Would you like to register the kernel module souces with DKMS? This will allow DKMS to automatically build a new module, if you install a different kernel later?
选择 No 继续。
Nvidia’s 32-bit compatibility libraries?
选择 No 继续。
Would you like to run the nvidia-xconfigutility to automatically update your x configuration so that the NVIDIA x driver will be used when you restart x? Any pre-existing x confile will be backed up.
选择 Yes 继续
8)验证驱动安装完成
nvidia-smi
2.1 docker 的安装
1)可选操作,卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
2)安装软件包以允许apt通过HTTPS使用存储库:
sudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common
3)添加Docker的官方GPG密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 通过搜索指纹的后8个字符,验证您现在是否拥有带有指纹的密钥 。
$ sudo apt-key fingerprint 0EBFCD88
pub rsa4096 2017-02-22 [SCEA]
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid [ unknown] Docker Release (CE deb) [email protected]
sub rsa4096 2017-02-22 [S]
4) 使用以下命令来设置稳定的存储库。要添加 每晚或测试存储库,请在以下命令中的单词后面添加nightly或test(或同时添加)stable。了解每晚和测试频道。
注意:下面的lsb_release -cs
子命令返回Ubuntu发行版的名称,例如xenial。有时,在Linux Mint等发行版中,您可能需要更改$(lsb_release -cs)
为父Ubuntu发行版。例如,如果您使用 Linux Mint Tessa
,则可以使用bionic。Docker对未经测试和不受支持的Ubuntu发行版不提供任何保证。
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
jetson_nano命令(jetson_nano自带docker)
sudo add-apt-repository \
"deb [arch=arm64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
5)更新apt包索引。
sudo apt-get update
6.安装最新版本的Docker Engine-Community和containerd
sudo apt-get install docker-ce docker-ce-cli containerd.io
可选linux的安装后步骤
以非root用户身份管理Docker
Docker守护程序绑定到Unix套接字而不是TCP端口。默认情况下,Unix套接字由用户拥有root,其他用户只能使用sudo
来访问它。Docker守护程序始终以root用户身份运行。
如果你不想在前言docker与命令sudo,创建一个名为UNIX组docker和用户添加到它。Docker守护程序启动时,它会创建一个可由该docker组成员访问的Unix套接字。
1.创建用户组
sudo groupadd docker
2.将您的用户添加到该docker组。
sudo usermod -aG docker $USER
3.注销并重新登录,以便重新评估您的组成员身份。
如果在虚拟机上进行测试,则可能需要重新启动虚拟机以使更改生效。
在桌面Linux环境(例如X Windows)上,完全注销会话,然后重新登录。
在Linux上,您还可以运行以下命令来激活对组的更改:
newgrp docker
4.验证您是否可以运行docker不带命令的命令sudo
docker run hello-world
docker version
sudo apt-get autoremove docker docker-ce docker-engine docker.io containerd runc
dpkg -l | grep docker
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P # 删除无用的相关的配置文件
sudo rm -rf /etc/systemd/system/docker.service.d
sudo rm -rf /var/lib/docker
sudo apt-get autoremove docker-ce-*
docker --version
2.2 安装nvidia-docker2
(1)移除之前的旧版本
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{
} -n1 docker ps -q -a -f volume={
} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker
(2)添加环境配置
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
(3)安装nvidia-docker2版本,备注:nvidia-docker2和nvidia-docker1区别后续说明。
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
(4)安装 nvidia-container-runtime 软件包:
sudo apt-get install nvidia-container-runtime
(5)添加docker守护进程文件
docker的守护进程参数配置一般在文件 /etc/docker/daemon.json,在该文件中写入
{
"default-runtime" : "nvidia",
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
配置完成后,重启docker
systemctl restart docker
(6)测试
从Docker Hub查找镜像—链接
语法
docker search [OPTIONS] TERM
OPTIONS说明:
--automated :只列出 automated build类型的镜像;
--no-trunc :显示完整的镜像描述;
-s :列出收藏数不小于指定值的镜像。
实例
从Docker Hub查找所有镜像名包含java,并且收藏数大于10的镜像
runoob@runoob:~$ docker search -s 10 java
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
java Java is a concurrent, class-based... 1037 [OK]
anapsix/alpine-java Oracle Java 8 (and 7) with GLIBC ... 115 [OK]
develar/java 46 [OK]
isuper/java-oracle This repository contains all java... 38 [OK]
lwieske/java-8 Oracle Java 8 Container - Full + ... 27 [OK]
nimmis/java-centos This is docker images of CentOS 7... 13 [OK]
参数说明:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。
测试
sudo docker run -ti --rm nvidia/cuda:9.0-base nvidia-smi
或
sudo docker run --runtime=nvidia --rm 5aafb863776b nvidia-smi
(第一次运行该指令会先下载对应版本的镜像文件,可能耗时较长)
下载成功后会输出证明安装成功
注意:nvidia-docker1和nvidia-docker2区别
那么两个版本之间有何区别呢?
(1) 虽然nvidia-docker1 和nvidia-docker2 都依赖于docker, 但版本1是一个整体的可行性文件,内部实现连接docker容器与硬件GPU,版本2将整体部分拆分层一个基于docker的薄封装(cat /usr/bin/nvidia-docker 可查看)和一个插件(nvidia-container-runtime , 该插件直接实现一个 hook的功能,连接GPU硬件),在版本2 的nvidia-docker 可发现,实际上还是运行docker ,只是指定了 --runtime 参数,同时指定GPU设备,默认全部GPU设备。
(2)当需要运行一个使用GPU的容器时,版本1 必须用nvidia-docker run/create 启动, 版本二可通过设置 守护进行default-runtime参数可直接通过 docker run/create 直接启动GPU容器
docker的守护进程参数配置一般在文件 /etc/docker/daemon.json
cat /etc/docker/daemon.json
[root@localhost hadoop]# cat /etc/docker/daemon.json
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
配置默认的插件环境 后
{
"default-runtime" : "nvidia",
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
配置完成后,重启docker
systemctl restart docker
docker容器的导入导出有两个方式docker export和docker import以及docker save和docker load。docker import和docker load导入都是导入成一个镜像,然后再跑一个容器。
docker export导出的是容器的快照,不会保存元数据。然后如果用这一种方式,就算你在你机器上创建的容器导出再导入都会出错。会使用不了GPU资源。所以,如果你想让其他人也使用也就需要使用docker save
,docker save是针对镜像的,所以我们需要先将我们搭建好的docker容器提交为一个镜像:
sudo docker commit container-name image-name:version
sudo docker commit
容器id 镜像名(自定义):版本(自定义)
然后使用docker save命令导出就好(save命令导出的是docker镜像文件,注意与容器文件区分):
docker save -o image-name.tar image-name:version
然后就OK了
3.1 deepstream5.0 镜像获取(适合无opencv需求场景)
然后在Generate API Key中点击Get API Key,点击右上角绿色按钮Generate API Key
1.1 安装docker和nvidia-docker2
apt-get update
apt-get install docker
apt-get install nvidia-docker2
1.2登录nvidia的ngc平台下载deestream镜像
docker login nvcr.io
Username: $oauthtoken
Password: bjBsMHJucnFzOHY5dmw4YzFzMzNhbmFtcTc6ZDM5Y2RlODAtM2I0MS00Y2VmLWFmZTctMmFmYmZlZmI5MWRk
输入自己在平台获取到的Username和Password。如果未登录,在下载镜像时会出现验证错误的字样。
下载镜像并运行,使用docker images查看所有镜像,使用docker ps查看运行中的镜像
https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_docker_containers.html
docker拉取镜像。推荐早上5,6点的时候下载
docker pull nvcr.io/nvidia/deepstream:5.0-dp-20.04-triton
docker run --gpus all --privileged=true -it -v /home/jdh/data:/root/host -p 5000:22 -m 2g -e DISPLAY=KaTeX parse error: Expected 'EOF', got '#' at position 96: …p-20.04-triton #̲该命令可以输出显示图像 doc…DISPLAY -w /opt/nvidia/deepstream/deepstream-5.0 nvcr.io/nvidia/deepstream:5.0-dp-20.04-triton
nvidia-docker run --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 --rm -it -v /tmp/.X11-unix:/tmp/.X11-unix -p 127.0.0.1:5000:22 -m 2g -e DISPLAY=$DISPLAY -w /opt/nvidia/deepstream/deepstream-5.0 nvcr.io/nvidia/deepstream:5.0-dp-20.04-triton
docker run --gpus all --net=host --privileged=true -it -v /tmp/.X11-unix:/tmp/.X11-unix -v /home/jdh/data:/root/software -p 6000:22 -m 2g -e DISPLAY=$DISPLAY -e GDK_SCALE -e GDK_DPI_SCALE -w /opt/nvidia/deepstream/deepstream-5.0 nvcr.io/nvidia/deepstream:5.0-dp-20.04-triton
错误解决1
unknown flag: --gpus
docker版本要>19.03才支持gpu选择
在jetson_nano上配置docker注意事项
在docker中画面显示
#在docker容器中添加当前使用xshell的ip以及端口—只适合CPU显示
export DISPLAY=192.168.1.64:10.0
ps:docker --privileged=true 参数作用
大约在0.6版,privileged被引入docker。
使用该参数,container内的root拥有真正的root权限。
否则,container内的root只是外部的一个普通用户权限。
privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。
甚至允许你在docker容器中启动docker容器。
$ docker help run
…
–privileged=false Give extended privileges to this container
…
这里以一个Mysql 例子
我们启动命令还没加 --privileged=true 参数 ,可以明确看到docker 尝试去运行容器,但是马上就关闭了。
命令
docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=123456 -p 9092:3306 -d daocloud.io/library/mysql:5.7.6
尝试使用一些命令,提示permission denied,权限禁止
加入参数命令后
docker run --name mysql-test --privileged=true -e MYSQL_ROOT_PASSWORD=123456 -p 9092:3306 -d daocloud.io/library/mysql:5.7.6
成功运行命令
5.2 获取cuda10.2镜像(适合有opencv需求场景)
1.去dockerhub搜索自己需要的cuda等镜像,或者可以使用docker search查找镜像
2.拉去合适的镜像
sudo docker pull nvidia/cuda:10.1-cudnn7-devel-ubuntu16.04
sudo docker pull nvidia/cuda:10.2-cudnn8-devel-ubuntu18.04
3.创建容器
通过-v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径
现在镜像内就可以共享宿主机里的文件了。
默认挂载的路径权限为读写。
#该命令可以输出显示图像
docker run --gpus all --net=host --privileged=true -it -v /tmp/.X11-unix:/tmp/.X11-unix -v /home/jdh/data:/root/software -p 6000:22 -m 2g -e DISPLAY=$DISPLAY -e GDK_SCALE -e GDK_DPI_SCALE -w /root nvidia/cuda:10.2-cudnn8-devel-ubuntu18.04
可能问题:
1.nvcc: command not found解决
添加环境变量,打开~/.bashrc ,添加环境变量如下:
export LD_LIBRARY_PATH=/usr/local/cuda/lib
export PATH=$PATH:/usr/local/cuda/bin
2.错误解决2
unknown flag: --gpus
docker版本要>19.03才支持gpu选择
3.在docker中画面显示
#在docker容器中添加当前使用xshell的ip以及端口
export DISPLAY=192.168.1.64:10.0
ps:docker --privileged=true 参数作用
大约在0.6版,privileged被引入docker。
使用该参数,container内的root拥有真正的root权限。
否则,container内的root只是外部的一个普通用户权限。
privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。
甚至允许你在docker容器中启动docker容器。
$ docker help run
…
–privileged=false Give extended privileges to this container
…
这里以一个Mysql 例子
我们启动命令还没加 --privileged=true 参数 ,可以明确看到docker 尝试去运行容器,但是马上就关闭了。
命令
docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=123456 -p 9092:3306 -d daocloud.io/library/mysql:5.7.6
尝试使用一些命令,提示permission denied,权限禁止
加入参数命令后
docker run --name mysql-test --privileged=true -e MYSQL_ROOT_PASSWORD=123456 -p 9092:3306 -d daocloud.io/library/mysql:5.7.6
成功运行命令
5.3 docker ssh配置
3、运行容器#
docker run --name iubuntu -t -i -d -p 3316:22 ubuntu
参数: –name 指定生成的容器的名称
-i: 以交互模式运行容器,保证容器中STDIN是开启的。通常与 -t 同时使用;
-t: 为容器重新分配一个伪tty终端,通常与 -i 同时使用;
-d: 后台运行容器,并返回容器ID;
-p:可以指定要映射的IP和端口,但是在一个指定端口上只可以绑定一个容器。支持的格式有 hostPort:containerPort、ip:hostPort:containerPort、 ip::containerPort。
ubuntu 则是镜像名称,镜像ID也可以的。
4、查看是否运行成功#
查看正在运行的镜像
docker ps
二、安装ssh服务
1、进入容器终端安装ssh服务#
docker exec -t -i iubuntu /bin/bash
2、执行更新#
apt-get update
等待,输入Y就可以了
3、安装ssh-client、ssh-server#
安装ssh-client命令#
apt-get install openssh-client
等待,输入Y就可以了
安装ssh-server命令#
apt-get install openssh-server
等待,输入Y就可以了
安装完成后,先启动服务#
/etc/init.d/ssh start
查看是否正确启动
ps -e|grep ssh
编辑sshd_config文件#
需要先安装vim编辑器#
apt-get install vim
编辑sshd_config文件#
vim /etc/ssh/sshd_config
添加UsePAM no
保存退出 ESC + : + WQ
ps:如果无法进入端口可在宿主机查看端口是否被占用,更换端口
sudo netstat -ap | grep 6000
如果还不行,可以在docker中该文件下更改端口号为自己设置的端口号,也可以远程接入
重启ssh服务#
service ssh restart
设置ssh密码#
passwd root
查看容器的IP#
先安装net-tools工具包#
apt-get install net-tools
查看IP#
apt-get install net-tools
ifconfig
退出#
exit
4、保存刚刚修改的镜像,方便后面使用
docker commit [容器ID/容器名] [REPOSITORY:TAG]
三、使用Xshell连接
1)测试
打开一个新终端,通过ssh root@host_ip -p 3316 进入docker:
2)在本机连接可以用localhost:3316连接也可以用宿主机IP:3316连接,账户名为root
然后连接就可以了 #
ps:docker修改容器端口映射的方法
方法一
1、停止容器(docker stop d00254ce3af7)
2、停止docker服务(systemctl stop docker)
3、修改这个容器的hostconfig.json文件中的端口(原帖有人提到,如果config.v2.json里面也记录了端口,也要修改)
hostconfig.json文件
config.v2.json文件
sudo -s
cd /var/lib/docker/containers/d00254ce3af7* #这里是CONTAINER ID
vim hostconfig.json
如果之前没有端口映射, 应该有这样的一段:
“PortBindings”:{}
增加一个映射, 这样写:
“PortBindings”:{“8080/tcp”:[{“HostIp”:"",“HostPort”:“60000”}]}
前一个数字是容器端口, 后一个是宿主机端口。将宿主机的60000端口映射到容器的8080端口
而修改现有端口映射更简单, 把端口号改掉就行。
1
4、启动docker服务(systemctl start docker)
5、启动容器(docker start d00254ce3af7)