Docker学习一

2017-01-10 09:59:54来源:oschina作者:yangzhiwen人点击

Docker 容器操作退出后重新进入


1.nsenter


安装


nsenter 工具在 util-Linux 包2.23版本后包含。 如果系统中 util-linux 包没有该命令,可以按照下面的方法从源码安装。


你也可以点击此链接进行下载 http://pan.baidu.com/s/1FEt8y


$ cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;
$ ./configure --without-ncurses
$ make nsenter && sudo cp nsenter /usr/local/bin

cd /tmp


为了连接到容器,你还需要找到容器的第一个进程的PID,通过这个PID,你就可以连接到这个容器:


[root@localhost tmp]# docker ps -a
CONTAINER ID IMAGE COMMANDCREATEDSTATUSPORTS NAMES
4214262382fd training/sinatra"/bin/bash"12 hours ago Up 40 minutesgigantic_fermi
3f2ca650ec1d ubuntu:12.04 "/bin/bash"13 hours ago Exited (127) 13 hours agodrunk_leavitt[root@localhost tmp]# docker inspect --format "{{ .State.Pid }}" 4214262382fd
9531

2.nsinit


从0.9版本开始,Docker自身就具有一个管理容器的库,名字为 libcontainer。libcontainer中的nsinit工具允许用户直接访问linux名字空间和cgroup内核。


在安装nsinit之前,你首先需要安装Go运行时环境:


[root@localhost tmp]# yum -y install git golang-go
[root@localhost tmp]# mkdir -p $HOME/go-dev/bin mkdir -p $HOME/go-dev/src
[root@localhost tmp]# echo "export GOPATH=/$HOME/go-dev" >> ~/.profile echo "PATH=/$PATH:/GOPATH/bin" >> ~/.profile
[root@localhost tmp]# source ~/.profile

nsinit读取的是位于/var/lib/docer/execdriver/native/容器目录下的配置数据。要运行nsinit,


你需要切换到容器目录下。由于/var/lib/docker目录对于root用户是只读权限,因此你还需要root权限。通过docker的ps命令,


你可以确定容器ID。一旦你进入/var/lib/docker目录,你就可以连接容器了:


[root@localhost default]# docker ps -a
CONTAINER ID IMAGE COMMANDCREATEDSTATUSPORTS NAMES
4214262382fd training/sinatra"/bin/bash"15 hours ago Up 19 minutesgigantic_fermi
3f2ca650ec1d ubuntu:12.04 "/bin/bash"16 hours ago Up 10 secondsdrunk_leavitt

进入已经启动的容器实例一


[root@localhost default]# docker attach 4214262382fd

尽量避免这种方式进入容器, 如果exit退出。 容器就会关闭


使用下面这个方法进入容器


[root@localhost default]# docker exec -it 3f2ca650ec1d /bin/bash

创建镜像


修改已有镜像


如果出现如下报错: 原因是json依赖ruby2.0版本


root@4214262382fd:/# gem install json
ERROR:Error installing json:
json requires Ruby version ~> 2.0.
root@4214262382fd:/# apt-get install ruby2.0
root@4214262382fd:/# cd /usr/bin/
root@4214262382fd:/usr/bin# ln -s /usr/bin/ruby2.0 ruby
root@4214262382fd:/usr/bin# ln -s /usr/bin/irb2.0 irb
root@4214262382fd:/usr/bin# ln -s /usr/bin/gem2.0 gem
root@4214262382fd:/usr/bin# ruby --version
ruby 2.0.0p384 (2014-01-12) [x86_64-linux-gnu]
root@4214262382fd:/# gem install json

当结束后,我们使用 exit 来退出,现在我们的容器已经被我们改变了,使用 docker commit 命令来提交更新后的副本。、


[root@localhost default]# docker ps -a
CONTAINER ID IMAGE COMMANDCREATEDSTATUSPORTS NAMES
4214262382fd training/sinatra"/bin/bash"16 hours ago Up 34 minutesgigantic_fermi
3f2ca650ec1d ubuntu:12.04 "/bin/bash"17 hours ago Up 52 minutesdrunk_leavitt
[root@localhost default]# sudo docker commit -m "Added json gem" -a "Docker Newbee" 4214262382fd ouruser/sinatra:v2
sha256:63c1913663a9c70ac24352434d20d324e3a75a4c5a6fc2cf360cabc43c340480

其中,-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;-a 可以指定更新的用户信息;之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。


创建成功后会返回这个镜像的 ID 信息。


使用 docker images 来查看新创建的镜像。


[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATEDSIZE
ouruser/sinatrav263c1913663a9 About a minute ago 590.6 MB
docker.io/ubuntu14.04 4d44acee901c 8 days ago187.9 MB
docker.io/ubuntu12.04 aefa163f7a7e 8 days ago103.5 MB
docker.io/training/sinatra latest49d952a36c58 2 years ago 447 MB

之后,可以使用新的镜像来启动容器


[root@localhost ~]# docker run -t -i ouruser/sinatra:v2 /bin/bash
exit
[root@localhost ~]# docker start ddc1268b3586启动容器

进入容器:


[root@localhost ~]# docker exec -it ddc1268b3586 /bin/bash

创建个nginx镜像


[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATEDSIZE
ouruser/sinatrav263c1913663a9 19 minutes ago590.6 MB
docker.io/ubuntu14.04 4d44acee901c 8 days ago 187.9 MB
docker.io/ubuntu12.04 aefa163f7a7e 8 days ago 103.5 MB
docker.io/training/sinatra latest49d952a36c58 2 years ago447 MB[root@localhost ~]# docker ps -a
CONTAINER ID IMAGECOMMANDCREATEDSTATUSPORTS NAMES
ddc1268b3586 ouruser/sinatra:v2 "/bin/bash"17 minutes agoUp 15 minutesnaughty_jennings
4214262382fd training/sinatra "/bin/bash"17 hours ago Up 56 minutesgigantic_fermi
3f2ca650ec1d ubuntu:12.04"/bin/bash"17 hours ago Up About an hour drunk_leavitt[root@localhost ~]# sudo docker commit -m "Added json gem" -a "Docker Newbee" ddc1268b3586 ouruser/sinatra:nginx
sha256:15ebf9658bf63045171e2dd32aafa71fd6c07004ce4c82a9e0fbcd2da423551b

从本地文件系统导入


要从本地文件系统导入一个镜像,可以使用 openvz(容器虚拟化的先锋技术)的模板来创建: openvz 的模板下载地址为 templates 。


http://openvz.org/Download/templates/precreated


比如,先下载了一个 CentOS6 64位 的镜像,之后使用以下命令导入:


[root@localhost iso]# wget http://download.openvz.org/template/precreated/centos-6-x86_64.tar.gz
[root@localhost iso]# cat centos-6-x86_64.tar.gz |docker import - centos:centos.6
sha256:525bb0e9c3bee14d0b8fa81cea96e319e3a408b09a14f65fa57ab6bd83c5ea46

查看新导入的镜像


[root@localhost iso]# docker images
REPOSITORY TAG IMAGE ID CREATEDSIZE
centoscentos.6 525bb0e9c3be 23 seconds ago615.8 MB

创建容器:


[root@localhost iso]# docker run -t -i centos:centos.6 /bin/bash

上传镜像


用户可以通过 docker push 命令,把自己创建的镜像上传到仓库中来共享。例如,用户在 Docker Hub 上完成注册后,可以推送自己的镜像到仓库中。


$ sudo docker push ouruser/sinatra
The push refers to a repository [ouruser/sinatra] (len: 1)
Sending image list
Pushing repository ouruser/sinatra (3 tags)

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台