在上一篇博客中介绍了编写简单的dockerfile的方法,可以通过编写dockerfile,然后利用dockerfile创建容器的方法,将一个工程创建为docker容器,然后通过docker run命令运行已创建的容器。
那么,如果本地或当前虚拟机上已存在一个docker镜像,我想要把它导到服务器上,可以怎么做呢?答案是save和load容器。
1、save
首先查看要保存的镜像的id
docker images
看到有资料形容images相当于类,containers相当于实例,可以这么理解。
找到要保存的镜像后用save保存成一个tar文件
# docker save -o [定义一个tar文件的文件名] [要保存的镜像的id]
docker save -o savetest.tar dd886f784c2c
# 生成的tar文件存储路径为当前路径下
2、load
保存之后可以在任何地方加载镜像了
将生成的tar文件上传到需要加载镜像的服务器后
docker load -i imagesname.tar
然后可以再次通过docker images命令查看加载的镜像
3、run
加载成功后,可以直接通过docker run命令运行镜像
docker run --name [指定一个用于与其它容器区分的name] -it -v [/home/dir:/home/dir] [用docker images可以查到的dockername]
ppps:-v是映射作用,将服务器本地的地址映射到容器内,否则的话在容器里是无法访问容器外的文件的
另外还可以用-p 8080:8080 选项进行端口映射
ps:如果在一台服务器上加载了一个镜像,并成功运行了一个该镜像的容器,如果为了操作互不影响,我想要另启一个这个镜像的容器的话,相当于我要再另外建一个该类的对象,而不需要重新定义(加载)这个类,所以只需要直接执行docker run就可以,和之前的区分在于自己指定一个可区分的容器的名称。
4、一些其它命令
首先与docker相关的命令都可以通过docker --help命令查询,命令都解释地很清楚
下面几个常用的:
docker ps -a #列出所有在运行的容器
docker images #列出所有镜像
#注意上面两个是不同的
# 一个容器启动了之后,如果不去stop它它是一直在开启的,那么如果终端关闭或者另开一个终端想要进入这个容器该用什么命令呢?
docker exec -it [用ps可以查到的容器号] [/bin/bash] #后面的参数来自于ps查询容器时的command列
docker rm # 删除容器(用ps可以查到id号的)
docker rmi # 删除镜像(用images可以查到id号的)
停用一个容器前面说到用stop,与之对应的是start
比如如果我要删除一个镜像的话,必须先把用它开启的容器删掉,删掉容器之前貌似是必须stop来着
具体命令就是:
docker stop 容器id
docker start 容器id
如果在一个容器里,想要退出的话用CTRL+D
5、容器内文件或文件夹与宿主机内的传递
docker cp命令
都是在宿主机(即容器外)执行
a. 容器复制到宿主机
docker cp 容器名:容器内文件路径 容器外要粘贴的路径
b. 宿主机复制到容器
docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面改对应的路径
6、要保存对一个docker容器的改动怎么办?答案:commit
上面用的save和load用于把已经存在的镜像在服务器之间搬运,而对一个容器做了改动之后,可以通过commit命令把容器生成成镜像,然后就可以通过save和load搬运了
docker commit [要保存的容器id] [起一个镜像名]
之后就可以通过docker images查看生成的镜像了
7、docker run 之后生成的container不是root权限
如果执行docker run 是root用户执行的,生成的container不是root的话,在docker run时加参数:-u root
8、docker tag
如果我通过docker save存出来一个image,load到另一台机器的话,可能load出来的image的repository和tag都是none
所以用docker tag给它标记
docker tag imageID 名字:tag
9、关于docker exec进入容器
一般是,docker exec -it 容器名或id bash
-it很重要,如果不加的话其实执行完这条命令就退出容器了
bash其实就是进入容器使用的命令,就相当于dockerfile里最后那个CMD命令,就是说CMD命令是可以在docker run或exec的时候替换最后的bash的。