关于Docker
缘起
配置环境真是要人命!
有一个办法:可以把环境打包,克隆给所有人使用,比如克隆一个虚拟机,不过虚拟机太笨重了,把整个操作系统都要保存下来,并不方便。于是有一个叫做Docker的东西出现了,好家伙,这玩意竟然可以在windows上面运行linux系统,而且是轻量级的,这个方案叫“容器”,Docker 是 Linux 容器的一种封装。具体细节我就不管了,交给computer science研究人员吧,我只需要会用就行了。
可以在主机上安装docker桌面版:
docker桌面版下载
下载之后要注册一个账号,然后登录。
界面是全英文的,网上有一些汉化方案,但好像不太行,我没有进行汉化。
概念
images
:译为“镜像”,在执行 pull 指令时,下载的就是这个镜像。Docker 把应用程序及其依赖,都打包在 image 文件里面。image可以生成container。
containers
:译为“容器”,我感觉译为“容器实例”或者“镜像实例”更合适,是在 image 基础上生成的。
# 列出本机的所有 image 文件。
docker image ls
# 删除 image 文件
docker image rm [imageName]
下载镜像
配置国内镜像
linux 下:
# linux下
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
适用于已安装 Boot2Docker 的 Windows 操作系统实例:
进入 Boot2Docker Start Shell,并执行以下命令:
sudo su echo "EXTRA_ARGS=\"–registry-mirror=https://mirror.ccs.tencentyun.com\"" >> /var/lib/boot2docker/profile exit
重启 Boot2Docker。
Windows桌面版设置:
Windows Docker 配置国内镜像源的两种方法
pull下载
有一个官方 docker 市场,里面可以下载各种镜像文件,dockerhub,不过好像被墙了,国内不太好下载,一般使用国内镜像站。
hello world
docker image pull library/hello-world
# 或者
docker image pull hello-world
docker image pull
是抓取 image
文件的命令。library/hello-world
是 image 文件在仓库里面的位置,其中library是 image 文件所在的组,hello-world
是 image 文件的名字。Docker 官方提供的 image 文件,都放在library组里面,所以它的是默认组,可以省略。
生成container
# 生成这个hello-world的一个container,会由image生成一个container
docker container run hello-world
# 这个hello-world运行完毕后会自动停止
进阶
假设我们现在要下载一个 tensorflow 的镜像。可以使用命令:
# 根据需要使用以下三个任一即可
docker pull tensorflow/tensorflow # latest stable release
docker pull tensorflow/tensorflow:devel-gpu # nightly dev release w/ GPU support
docker pull tensorflow/tensorflow:latest-gpu-jupyter # latest release w/ GPU support and Jupyter
# 冒号后面的是标签,表示不同版本
# 生成容器,参数 -it: 让docker使用交互式输出,使用该参数后,终端即为容器中的系统的终端,
# 参数 bash,在语句结尾的,运行镜像后立即执行的指令,bash指在容器内执行/bin/bash命令,保证用户可以使用 Shell。
docker run -it tensorflow/tensorflow bash
# 运行整个指令后的效果是:
# 如果本机没有 tensorflow/tensorflow 镜像,则会自动下载,如有或者下载完毕后,会进入虚拟系统的终端。
# 下面的操作就和Linux操作一样了。
# 看看另一个指令,这里 -p 指令是指定端口映射,格式为:主机(宿主)端口:容器端口,将容器端口映射到主机端口,这在web开发时很有用
docker run -it -p 8888:8888 tensorflow/tensorflow:nightly-jupyter
# 还有一个参数 -name 是指定生成容器的名称,如果没有这个参数,则系统随机生成名称
# 如果使用的是docker桌面版,则在run之后,能看到containers里面多了一个名称很奇怪的容器,容器的image就是刚刚run时使用的image
# 同时还能看到名称下面有一个id号
# 查看我们正在运行的容器的信息
docker ps
# 启动某个容器
docker container start [containerID]
# 停止
docker container stop [containerID]
# 强行终止
docker kill [containerID]
# 重启
docker restart <容器 ID>
# 其他参数 -d 后台运行
docker run -itd --name ubuntu-test ubuntu /bin/bash
# 在后台运行时,如果想进入,使用attach或者exec,两者不同:attach 的退出会致使容器停止,exec的退出不会使容器停止
docker attach <容器 ID> # 如果此时从这个容器退出,会导致容器的停止。
docker exec -it <容器 ID> /bin/bash
# 其他参数 -v 指定在主机文件夹中运行。启动一个ubuntu容器,宿主机的/data1目录挂载到容器的/data2目录
docker run -it -v /data1:/data2 centos /bin/bash
# 在容器启动后,容器内会自动创建/data2的目录。
# -v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。
# 冒号”:”前后的路径必须是绝对路径,以下斜线“/”开头。
# 宿主机目录如果不存在,则会自动生成。
# 导出容器,导出容器快照到本地文件。
docker export 1e560fca3906 > ubuntu.tar
# 导入快照,将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
# 通过指定 URL 或者某个目录来导入,例如:
docker import http://example.com/exampleimage.tgz example/imagerepo
#退出
exit
# 退出码:0正常退出
# 非0,退出异常
# 查看容器状态
docker ps -a
# STATUS: 容器状态。
# 状态有7种:
# created(已创建)
# restarting(重启中)
# running(运行中)
# removing(迁移中)
# paused(暂停)
# exited(停止)
# dead(死亡)
docker container ls # 列出本机正在运行的容器
# (加入--all参数列出所有容器,包括已停止运行的容器)
docker container rm [container_id] # 删除ID为[container_id]的容器
与主机进行文件传输
docker container cp [containID]:[/path/to/file]
# 例如
docker cp [containID]:/my_keras_model/ E://linshi/
运行一个web应用
runoob@runoob:~# docker pull training/webapp # 载入镜像
runoob@runoob:~# docker run -d -P training/webapp python app.py
# -d:让容器在后台运行。
# -P:将容器内部使用的网络端口随机映射到我们使用的主机上。
runoob@runoob:~# docker ps
CONTAINER ID IMAGE COMMAND ... PORTS
d3d5e39ed9d3 training/webapp "python app.py" ... 0.0.0.0:32769->5000/tcp
使用GPU
使用最新的 TensorFlow GPU 映像在容器中启动 bash shell 会话:
docker run --gpus all -it tensorflow/tensorflow:latest-gpu bash
# 如果需要指定文件夹,需要加上 -v参数
docker run --gpus all -it --name gpulab -v E:\\CodeCenter\\shenjing:/data2 tensorflow/tensorflow:latest-gpu bash
其他使用指令
本地制作镜像保存并导出
先查看本地 images 列表,找到IMAGE ID ,然后使用 save
命令保存(导出),将导出文件传输到另一台机器,在另一台机器上使用 load
命令导入,再打上tag和REPOSITORY名称即可。
# 查看本地images 列表,获取IMAGE ID
sudo docker images
# 将指定id的Image导出到本地
sudo docker save aba01f181a4a > /opt/webconsole.tar
# 在另一台机器上导入
sudo docker load < webconsole.tar
# 查看导入情况
sudo docker images
# 打上tag和REPOSITORY
sudo docker tag aba01f181a4a webconsole:latest
# 运行
sudo docker run -itd webconsole:latest
# 查看ip地址
sudo docker inspect docker_name
使用apache/nginx
在云服务器上,安装docker,使用docker镜像的网站,可以便于网站的迁移。
先回顾一下什么是nginx:
Nginx (pronounced "engine-x") is an open source reverse proxy server for HTTP, HTTPS, SMTP, POP3, and IMAP protocols, as well as a load balancer, HTTP cache, and a web server (origin server). The nginx project started with a strong focus on high concurrency, high performance and low memory usage. It is licensed under the 2-clause BSD-like license and it runs on Linux, BSD variants, Mac OS X, Solaris, AIX, HP-UX, as well as on other nix flavors. It also has a proof of concept port for Microsoft Windows. Nginx读作“engine-x”,是用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议的开源反向代理服务器,以及负载平衡器、HTTP 缓存和 Web 服务器(源服务器)。nginx 项目一开始就非常注重高并发、高性能和低内存使用率。它根据 2 条款类 BSD 许可证获得许可,可在 Linux、BSD 变体、Mac OS X、Solaris、AIX、HP-UX 以及其他 nix 版本上运行。它还具有用于Microsoft Windows的概念验证端口。
先看看nginx,拉取:
# 拉取
docker pull nginx
# 假设已有静态网页文件,在文件夹/some/content下,那么可以使用下面的命令运行起来
docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
# 或者,可以使用简单的Dockerfile来生成新的镜像
FROM nginx
COPY static-html-directory /usr/share/nginx/html
# 含义是将主机的static-html-directory文件夹下内容拷贝到nginx工作目录,创建属于自己的新的镜像,然后生成一个实例,即可
docker build -t some-content-nginx
docker run --name some-nginx -d some-content-nginx
# 如果需要指定端口:将主机的8080映射到容器的80端口
docker run --name some-nginx -d -p 8080:80 some-content-nginx
# 然后可以在浏览器中访问主机的 http://localhost:8080 或者 http://host-ip:8080
进阶操作:
您可以使用自己个性化的配置文件,使用它构建新image:
# 首先,将原有的配置文件拷贝出来
docker run --name tmp-nginx-container -d nginx
docker cp tmp-nginx-container:/etc/nginx/nginx.conf /host/path/nginx.conf
# 删除这个临时Image
docker rm -f tmp-nginx-container
# 然后在主机上编辑/host/path/nginx.conf,根据自己的需求制定即可
# 最后,使用自定义的配置文件生成新的镜像,运行,即可
docker run --name my-custom-nginx-container -v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx