1. > 电脑手机 >

docker共享目录(docker共享文件)

不通过 docker hub 怎样把 docker image 共享给别人

将ubuntu push到私有registry

docker push rd-server:5000/ubuntu

如何将ubuntu的所有分支都镜像到自己的私有仓库?

1.先打TAG,把需要的版本打上标签,然后进行推送

语句大概是这个样子的:

docker tag eb601b8965b8 rd-server:5000/ubuntu:raring

docker tag eb601b8965b8 rd-server:5000/ubuntu:13.04

docker tag 9f676bd305a4 rd-server:5000/ubuntu:saucy

docker tag 9f676bd305a4 rd-server:5000/ubuntu:13.10

docker tag 9cd978db300e rd-server:5000/ubuntu:precise

docker tag 9cd978db300e rd-server:5000/ubuntu:latest

docker tag 9cd978db300e rd-server:5000/ubuntu:12.04

docker tag 9cc9ea5ea540 rd-server:5000/ubuntu:lucid

docker tag 9cc9ea5ea540 rd-server:5000/ubuntu:10.04

docker tag 5ac751e8d623 rd-server:5000/ubuntu:quantal

docker tag 5ac751e8d623 rd-server:5000/ubuntu:12.10

开始推送

docker push rd-server:5000/ubuntu

如果返回的内容的最后一行是下面这个样子的

2014/03/14 08:22:14 push: }

请反复执行,没错,不要怀疑,请循环一直反复执行下去

docker pull rd-server:5000/ubuntu

直到不再出现 push:

}的字样

不知道这是docker的BUG还是本身设计是这样的,需要反复多次push才能将完整的tag推送到private

registry里,否则在客户端下载的时候总会提示某些image找不到,个人猜测可能是这么设计的,因为docker

image比较大,而一个repo会有很多的块文件,每次push的时候只Push一个块,好了,猜测就道这,活还是得干,所以,写个脚本解决手工的问题吧。

#!/bin/sh

#

#Copyright (c) 2014 ZhengXujin xujinzheng@gmail.com

#

server="127.0.0.1:5000"

index_repo_name="username/ubuntu"

private_repo_name="ubuntu"

echo "\n"

echo " ## ."

echo " ## ## ## =="

echo " ## ## ## ## ==="

echo " /""""""""""""""""\___/ ==="

echo " ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~"

echo " \______ o __/"

echo " \ \ __/"

echo " \____\______/"

echo "\n"

idx=0

is_continue=1

docker images|grep -q "$server/$private_repo_name"

if [[ $? -ne 0 ]]; then

docker images|grep $index_repo_name|awk -F" " '{printf("docker tag %s %s/%s:%s\n",$3,"'$server'","'$private_repo_name'",$2)}'|bash

fi

while [ $is_continue -eq 1 ]

do

docker push $server/$private_repo_name

is_continue=$?

let idx=$idx+1

echo "$(tput setaf 1)continue push, $idx times pushed. $(tput sgr

Docker: 使用jupyter notebook基础镜像搭建自己的 pytorch 开发环境

启动最基本的jupyter notebook镜像:

使用基础镜像 jupyter/datascience-notebook ,因为它预装了常用的模块:pandas, matplotlib, scipy, seaborn, scikit-learn, scikit-image, sympy, cython, patsy, statsmodel, cloudpickle, dill, numba, bokeh;

dockerrun-it--rm -p 8888:8888 jupyter/datascience-notebook:281505737f8a

1

其中

docker run是使用一个镜像生成一个运行的容器;

-it指交互模式,启动后终端在运行着的容器里面,与之对应的有-d后端运行模式,启动后终端交互在实体机,要想进入容器需要使用命令docker exec -it container-name bashdocker exec -it container-name意为交互模式进入正在运行的一个容器,bash意为进入容器后使用的命令,这里用的是bash,这样进入容器后就能执行shell;

--rm意为退出shell的时候自动删除容器,常在测试的时候使用,这样不用每次修改去删除已有的容器;

-p 8888:8888指的是端口映射,前面的是实体机的端口,后面是容器里面暴露出的端口,两边端口可以不一样,这样同一个镜像可以启动多个对应不同端口的服务;

jupyter/datascience-notebook:281505737f8a是镜像名字,冒号后面的是tag,类似于版本的概念,如果不显式的给出tag每次都回从hub上拉取latest的镜像,如果网络环境不好的话比较费时间,推荐显式给出tag,这样每次构建都会使用已有的镜像。

启动后就可以在终端看到:

[I 04:01:05.691 NotebookApp] Running the core application with no additional extensions or settings

[I 04:01:05.692 NotebookApp] Serving notebooks from local directory: /home/jovyan

[I 04:01:05.692 NotebookApp] 0 active kernels

[I 04:01:05.692 NotebookApp] The Jupyter Notebook is running at:

[I 04:01:05.692 NotebookApp] ip addresses on your system]:8888/?token=0a3331628e0e35f94eb0ad543faeb3e396fbccfa3ff06e5a

[I 04:01:05.692 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

[C 04:01:05.692 NotebookApp]

Copy/paste this URL into your browser when you connect for the first time,

to login with a token:

此时是停在容器里面,打开浏览器 访问http://localhost:8888/?token=0a3331628e0e35f94eb0ad543faeb3e396fbccfa3ff06e5a即可打开基本的jupyter notebook 环境,后面的token是随机生成的;

启动带权限的容器

生成自定义token

# Python脚本生成密码i

# Python脚本生成密码

import IPython

IPython.lib.passwd()

输入密码生成token

test的token:sha1:6587feaef3b1:6b243404e4cfaafe611fdf494ee71fdaa8c4a563

自定义token运行容器:

docker run -d -p 8888:8888 jupyter/datascience-notebook start-notebook.sh --NotebookApp.password='sha1:6587feaef3b1:6b243404e4cfaafe611fdf494ee71fdaa8c4a563'

这时访问http://localhost:8888/会出现输入密码的页面,输入正确的密码才能进入jupyter。

共享目录

-v参数

docker提供-v参数使实体机和容器共享目录,这对于有状态的服务很有用,目录挂载添加参数:

-v /home/jason/jason/docker/notebook:/home/jovyan/work

运行带有目录共享的容器

docker run-it--rm-p8888:8888-v/home/jason/jason/docker/notebook:/home/jovyan/work jupyter/datascience-notebookstart-notebook.sh--NotebookApp.password='sha1:6587feaef3b1:6b243404e4cfaafe611fdf494ee71fdaa8c4a563'

这样在jupyter里新建的notebook都会出现在实体机指定的目录里。由于这个镜像的原因 需在work目录下新建才能在实体机看到。

基于jupyter/datascience-notebook 生成pytorch image

Dockerfile

因为没有合适的pytorch镜像,自己编辑Dockerfile:

新建文件Dockerfile并编辑内容:

FROM jupyter/datascience-notebook:281505737f8a

MAINTAINER Jason.W. "jianchengss@163.com"

# 下面是按官网的方法安装spotlight

#RUN pip --no-cache-dir install --upgrade install

#RUN pip --no-cache-dir install --upgrade torchvision

# pytorch

RUN conda install pytorch torchvision -c soumith

# spotlight()

RUN conda install -c maciejkula -c soumith spotlight=0.1.2

build

在Dockerfile目录里运行命令:docker build -t jianchengss/datascience-pytorch:0.1 .

这样就生成了image:jianchengss/datascience-pytorch:0.1可以运行docker images查看本机上所有的image。

从构建的镜像运行容器

docker run-it--rm-p8888:8888-v~/workspace/python/notebooks-pytorch:/home/jovyan/work--privileged=truejianchengss/datascience-pytorch:0.1start-notebook.sh--NotebookApp.password='sha1:6587feaef3b1:6b243404e4cfaafe611fdf494ee71fdaa8c4a563'

最终容器

经过以上步骤,测试完成后既可以执行最终运行的命令 注意 token换成自己的

docker run-d-p8588:8888-v~/workspace/python/notebooks-pytorch:/home/jovyan/work--privileged=true--name=pytorch jianchengss/datascience-pytorch:0.1start-notebook.sh--NotebookApp.password='sha1:7aee2f913c8e:17d40f203cbd5c9820f302894a92724c3de9fba6'

-it --rm换成了-d,比之前多的参数有:

--name=pytorch,意为给container取一个名字,好区分和管理,缺省的话名字为一串随机的字符串。

--privileged=true出现文件夹访问权限的时候添加该属性

此时运行docker ps即可查看运行着的容器:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

3bd3e30e9ab3 jianchengss/datascience-pytorch:0.1 "tini -- start-notebo" 4 seconds ago Up 3 seconds 0.0.0.0:8588->8888/tcp pytorch

进入容器操作

容器启动后有时候需要进入容器操作,比方说查看信息或者安装新的软件,此时执行docker exec -it pytorch bash

其他命令

docker stop container-name # 停止运行着的容器

docker rm container-name # 删除已有的容器,要先停止

docker rmi image-name # 删除已有的镜像

docker共享目录(docker共享文件)docker共享目录(docker共享文件)


docker怎么指定容器卷挂载到某个目录

docker可以支持把一个宿主机上的目录挂载到镜像里。 docker run -it -v /home/dock/Downloads:/usr/Downloads ubuntu64 /bin/bash 通过-v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径。 现在镜像内就可以共享宿主机里的

docker 使用

运行容器

sudo docker run -it -v /home/lcj/test_docker:/home/lcj/test_docker tensorflow/tensorflow:1.13.1-gpu-py3

参数:

-d 后台运行并返回容器ID,如 -itd

-e 设置环境变量,如 -e NVIDIA_VISIBLE_DEVICE=0 使用编号为 0 的GPU

-i 打开 STDIN,用于控制台交互,通常跟 -t 一起使用

--net 容器网络设置,如 --net my_network,或者 --net=contianer:NAME_or_ID,使用其他容器的网络,共享 IP 和 PORT 等资源

--restart 指定容器停止后的启动的策略,如 --restart=always

--runtime=nvidia 使用 nvidia 模式运行,跟 -e 一起使用,可以在容器里使用 GPU

-t 为容器重新分配一个伪输入终端,通常与 -i 一起使用

-v 给容器挂载存储卷,挂载到容器的某个目录,如 -v /home/lcj/test_docker:/home/lcj/test_docker

-w 指定容器的工作目录

停止容器

docker stop 容器ID

或者 docker stop `docker ps -a -q` 停止所有容器

重启容器

docker restart 容器ID

进入一个运行中的容器

docker attach 容器ID

保存容器

docker save myimage | bzip2 -9 -c > /home/lcj/save.tar.bz2

加载容器

bzip2 -d -c < /home/lcj/save.tar.bz2 | docker load

杀掉运行中的容器

docker kill -s KILL 容器ID

-s:向容器中发送一个信号

docker rm 命令

参数:

-f :通过 SIGKILL 强制删除一个容器,如 docker rm -f a

-l:移除容器间的网络连接,而非容器本身,如 docker rm -l b,其中 b 为连接名,而非容器名

-v:删除与容器关联的卷

docker create :创建一个容器但不运行它,语法同 docker run

docker ps

-a:显示所有的容器,包括未运行的

-f:根据条件过滤显示的内容

-l:显示最近创建的容器

-n:列出最近创建的 n 个容器

-q:静默模式,只显示容器 ID

列出所有创建的容器 ID

docker ps -a -q

停止所有容器 ID

docker stop `docker ps -a -q`

获取容器/镜像的元数据

docker inspect 容器/镜像名

docker top :查看容器中的进程信息

docker top a(a 是容器)

docker attach :链接到正在运行的容器(该容器必须正在运行)

docker attach a (a 是容器)

docker events :从服务器获取实时事件

-f:根据条件过滤事件

--since:从指定的时间戳后显示所有的事件

--until:流水时间显示到指定的时间为止

显示docker 2016年7月1日后的所有事件

docker events -since="1467302400"

显示docker 镜像为mysql:5.6 2016年7月1日后的相关事件

docker events -f "image"="mysql:5.6" --since="1467302400"

备注:如果指定的时间是到秒级的,需要将时间转成时间戳。如果时间为日期的话,可以直接使用,如--since="2016-07-01"

docker export :将文件系统作为一个 tar 压缩文件导出到 STDOUT

docker port :列出指定的容器端口的映射,或者查找将 PRIVATE_PORT NAT 到面向公众的端口

docker port a(a 为容器名)

docker commit : 从容器创建一个新的镜像

-a:提交的镜像作者

-c:使用 Dockerfile 文件来创建镜像

-m:提交时说明的文字

-p:在 commit 时暂停容器

docker commit -a 'lcj' -m 'has update' 容器 ID 镜像名

docker cp :用于容器与主机之间的数据拷贝

将主机的 test_docker 目录拷贝到容器 /home/lcj 目录下

docker cp /home/lcj/test_docker 容器 ID:/home/lcj/

将容器 /home/lcj 目录拷贝到主机的 test_docker 目录下

docker cp 容器 ID:/home/lcj//home/lcj/test_docker

docker login/logout :登录或退出一个 Docker 镜像仓库,如果未指定镜像仓库地址,则默认为 官方 Docker Hub

docker login -u 用户名 -p 密码

docker logout

docker pull :从镜像仓库中拉取或者更新指定镜像

docker pull java

docker push :将本地的镜像上传到镜像仓库,需先登录到镜像仓库

docker push myapache:v1

docker search :从 Docker Hub 查找镜像

--automated,只列出 automated build(自动生成) 类型的镜像

--no-trunc,显示完整的镜像描述

-s:列出收藏数不少于指定值的镜像

从Docker Hub查找所有镜像名包含java,并且收藏数大于10的镜像

docker search -s 10 java

docker images :列出本地所有的镜像

-a:列出本地所有的镜像(含中间映像层,默认情况下,过滤中间映像层)

-q:只显示镜像 ID

docker images 或 docker images ubuntu,列出本地所有镜像或本地仓库名为 ubuntu 的所有的镜像

docker rmi :删除一个或多个镜像

-f:强制移除

--no_prune:不移除该镜像的过程镜像,默认移除

强制删除本地镜像w3cschool/ubuntu:v4

docker rmi -f w3cschool/ubuntu:v4

docker tag :标记本地镜像,将其归入到某一个仓库

将镜像ubuntu:15.10标记为 w3cschool/ubuntu:v3 镜像

docker tag ubuntu:15.10 w3cschool/ubuntu:v3

docker build:使用 Dockerfile 文件创建镜像

使用当前目录的Dockerfile创建镜像

docker build -t w3cscholl/ubuntu:v3 . (不要漏掉最后的 . 符号)

使用URL 的 Dockerfile 创建镜像

docker build

docker history :查看指定镜像的创建历史

docker save :将指定镜像保存成 tar 压缩文件

-o:输出到文件

docker save -o my_ubuntu_v3.tar w3cschool/ubuntu:v3

docker import:从压缩文件中创建镜像

-c:应用 docker 指令创建镜像

-m:提交时的说明文字

从镜像归档文件my_ubuntu_v3.tar创建镜像,命名为w3cschool/ubuntu:v4

docker import my_buntu_v3.tar w3cschool/ubuntu:v4

docker-修改容器挂载目录的3种方法小结

方式一:修改配置文件(需停止docker服务)

1、停止docker服务

systemctl stop docker.service(关键,修改之前必须停止docker服务)

2、vim /var/lib/docker/containers/container-ID/config.v2.json

修改配置文件中的目录位置,然后保存退出

3、启动docker服务

4、启动docker容器

详解Docker——你需要知道的Docker进阶知识三

我们可以将数据保存在容器中,但是这样存在一些缺点:

针对上述的缺点,有些数据,例如数据库文件,我们不应该将其保存在镜像或者容器的可写层中。Docker 提供三种不同的方式将数据从 Docker 主机挂载到容器中,分别为卷( volumes ),绑定挂载( bind mounts ),临时文件系统( tmpfs )。很多时候, volumes 总是正确的选择。

无论使用上述的哪一种方式,数据在容器内看上去都是一样的。它被认为是容器文件系统的目录或文件。

对于三种不同的存储数据的方式来说,卷是唯一完全由 Docker 管理的。它更容易备份或迁移,并且我们可以使用 DockerCLI 命令来管理卷。

列出本地可用的卷列表:

这种由系统随机生成名称的卷称为 匿名卷 ,匿名卷名称不具备可读性,使用起来不太方便,所以创建卷时一般会指定其 name 。例如我们创建一个名为 volume1 的卷。

创建好卷之后,我们可以用卷来启动一个容器,这里首先需要学习 docker container run 命令的两个参数:

对于前面创建的卷 volume1 ,可使用如下命令来在容器中使用:

使用 --mount 的命令如下:

上述操作,我们运行了两个容器,并分别挂载了一个卷。对于这两个容器来说,由于挂载的是同一个卷,所以它们将共享该数据卷。多个容器共享数据卷时,需要注意并发读写问题。可以分别连接到两个容器中,操作数据来验证数据是同步的。

绑定挂载( bind-mounts )通过将主机上的目录挂载到容器中,使得容器可以操作和修改主机上的文件。

例如,我们将 /home/hellodocker 目录挂载到容器中的 /home/hellodocker 目录下,使用的命令如下:

而如果使用 --mount ,相应的语句如下:

上述两个操作针对的是目录,而对于挂载文件来说,可能会出现一些特殊情况,涉及到绑定挂载和使用卷的区别。下面我们重现这一操作:

首先在当前目录,即 /home/hellodocker 目录下,创建一个 test.txt 文件。并向其中写入文本内容 "test1":

接着创建一个容器 hellodocker6 ,将 test.txt 文件挂载到容器中的 /test.txt 路径,并查看容器中 /test.txt 文件的内容:

这时新打开一个终端,通过 echo 命令向 /home/hellodocker/test.txt 文件追加内容 "test2",并在容器中查看 /test.txt 文件的内容:

这时无论是在容器中还是主机上都能查看到该文件的最新内容。接下来在主机上查看 test.txt 的 inode 号,并使用 vim 编辑该文件,添加 "test3",并查看该文件的内容:

在主机上使用 vim 编辑后,通过 vim 做出的修改并不能在容器中查看到

这是因为 vim 编辑文件的时候,会将文件内容暂存到一个临时文件中,退出保存后会删除原来的文件,并将临时文件重命名为原文件。但是我们标识文件是通过 inode ,因此 Docker 绑定的依然是旧的主机文件,所以容器中看到的依然是旧的内容。

对于数据卷来说,由 docker 完全管理,而绑定挂载需要我们自己去维护。我们需要自己手动去处理这些问题,这些问题并不仅仅是上面演示的这些,还有用户权限, SELINUX 等。

tmpfs 只存储在主机的内存中。当容器停止时,相应的数据就会被移除。

不通过 docker hub 怎样把 docker image 共享给别人

Dockerfile 中 ADD 和 COPY 命令不能使用绝对路径,只能使用相对路径。

这点在官方文档中说的比较清楚 如果不是非要把文件 build 到 image里,可以通过 run container 的时候通过 -v 参数将 host 文件或目录加载/共享到 container 里。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, website.service08@gmail.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息