其他
Docker入门,看了不理解,假一赔命
The following article is from 码农沉思录 Author 无人区修炼者
这篇博客适合谁? 对于Docker并不了解,只是有一点模糊的感觉,觉得Docker可以当成虚拟机用之类的 只是下载了Docker软件,对于怎么配置,怎么玩,第一步干什么,完全一无所知 其二,我从对Docker只有及其模糊(真的是模糊,我除了知道Docker是跟虚拟系统有关其他啥都不知道),到现在起码一问一不知(对应一问三不知)的状态,大概花了8个小时。 这期间全靠我从网络上搜索到的资料。 现在用我的话写出来,我觉得对于跟我相同开始情况的小白用户,能省不少时间,所以我要写。 其次,确实,现在Docker相关的文章真的太多了,那我为什么还要写呢? 你做了哪些工作? 首先,我一直都很好奇Docker这个东西,但从来没有机会去使用它。 但是,这学期OS课的lab,纯Linux系统编程,虽然使用双系统或者虚拟机都是纯小学生的难易程度了,也不麻烦,但我想,为什么不用Docker呢? 用双系统或者虚拟机也太过小儿科! 所以,我就这样接触了Docker 那么我使用Docker实现了什么? 在lab中,我们需要用到的是纯终端下的gcc工具链还有vim等,那么这就是我需要的全部软件了! 于是我在Docker中实现了「gcc+gdb+vim」环境,并push到了hub中。 首先对于Docker的概念作出我的解释,尽量通俗易懂 接着针对我用Docker的目的,从最开始的软件下载,到最后push一个自己的镜像到hub,整个过程以白话的形式描述出来,降低入门门槛,节省你的学习时间 很高兴你问了我这个问题。
入门Docker,你要下载什么?注册什么?
注册DaoCloud账号,获取加速服务!
镜像(Image) 镜像是静态的、可以被用户互相分享的文件。 我们玩过双系统和虚拟机的人都知道,首先你需要一个.iso镜像,才能安装系统。 Docker中的镜像也是这个东西,镜像是静态的,你不能对他操作,只能pull别人的镜像或者push自己的镜像。 容器(Container) 前面说过,镜像是静态不可操作的,只能被分享和下载,那什么是能被操作的呢? 就是容器里! 容器可以理解为镜像的动态状态,也就是我们虚拟机中系统装好后的状态,其实这么说是不对的,容器最符合的描述应该是Linux的iso文件的 Live CD
模式,比如我们玩双系统时都进入过Live CD
模式,不安装系统而直接进入系统,很神奇是吧,Docker的容器就是这个概念,只不过更加轻量更加迅速便捷。但是 Live CD
的害处就是你关机后作出的修改安装的软件全部gg,容器也是一样,一旦被直接推出,之前安装的gcc啊vim啊啥的就会全部gg掉。如果要保存修改,就需要将当前容器封装成一个新的镜像,这样下次启动这个新的镜像后之前作出的修改还都在。 仓库(Repository) 各位在前面看到我写的pull和push什么的,有没有晕? 不知道各位对于git熟悉不熟悉,Docker中的仓库很像git的代码仓库,你可以pull自己之前push到自己仓库的镜像到本地,也可以pull别人push到公共仓库的镜像到自己本地。 说白了就是百度云盘,你可以上传(push)自己做好环境的Docker上去,也可以下载(pull)自己云端的镜像到本地。 同时,我们知道百度云最大的特点就是分享(你懂的嘿嘿嘿),类比Docker,如果你得到百度云分享链接(别人的镜像名字、标签和别人的用户名),你还可以下载(pull)别人分享的镜像到自己的本地,别人也可以下载(pull)你的镜像,因为Docker仓库都是公共的。 当然,每个免费用户有一个名额把自己的一个镜像设为私有。
查看Docker版本信息
终端输入:
docker version
~$ docker version
Client:
Version: 17.06.2-ce
API version: 1.30
Go version: go1.8.3
Git commit: cec0b72
Built: Tue Sep 5 20:12:06 2017
OS/Arch: darwin/amd64
docker search ubuntu
,或者你想要的任何一个版本号的linux:~$ docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating s... 6636 [OK]
dorowu/ubuntu-desktop-lxde-vnc Ubuntu with openssh-server and NoVNC 131 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of of... 105 [OK]
ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ansible 86 [OK]
ubuntu-upstart Upstart is an event-based replacement for ... 80 [OK]
neurodebian NeuroDebian provides neuroscience research... 40 [OK]
ubuntu-debootstrap debootstrap --variant=minbase --components... 31 [OK]
docker pull ubuntu:latest
,其中的latest是一个标签(tag),表示是当前最新版本。你应该得到的信息,类似这样的~$ docker pull ubuntu:latest
Trying to pull repository docker.io/library/ubuntu ...
latest: Pulling from docker.io/library/ubuntu
aed158d74952: Pull complete
773ae8273d14: Pull complete
d1d487w88782: Pull complete
cd3d6cd6c0cf: Pull complete
8d73bu79120c: Pull complete
Digest: sha256:35bc48a1ca97c3f74rhf378hj92hd82j29i4hf4hf84nf0dhnsid232de8d8
Status: Downloaded newer image for docker.io/ubuntu:latest
docker pull registry.hub.docker.com/ubuntu:latest
registry.hub.docker.com
中的名为ubuntu
的仓库中下载标签为latest
的镜像。~$ docker pull chug/ubuntu14.04x64
查看你本地的镜像仓库!
docker images
命令查看你自己的本地镜像,我随便找了个例子,你的也应该是类似这样的:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu 16.04 e4415b714b62 11 days ago 128.1 MB
docker.io/ubuntu latest e4415b714b62 11 days ago 128.1 MB
docker.io/ubuntu 12.04 aefa163f7a7e 11 days ago 103.5 MB
docker.io/centos latest 0584b3d2cf6d 3 weeks ago 196.5 MB
在列出信息中,可以看到几个字段信息:
来自于哪个仓库,比如 ubuntu 镜像的标记,比如 16.04 它的 ID 号(唯一),比如e4415b714b62 创建时间 镜像大小 其中镜像的 ID 唯一标识了镜像,注意到 ubuntu:16.04 和 ubuntu:latest具有相同的镜像 ID ,说明它们实际上是同一镜像。TAG 信息用来标记来自同一个仓库的不同镜像。例如 ubuntu 仓库中有多个镜像,通过 TAG 信息来区分发行版本,例如10.04 、 12.04 、 12.10 、 13.04 、 14.04 等。例如可以使用 docker run -t -i ubuntu:16.04 /bin/bash
命令指定使用镜像ubuntu:16.04
来启动一个容器。如果不指定具体的标记,则默认使用latest
标记信息。
~$ docker run -it chug/ubuntu14.04x64 /bin/bash
root@aa97ba3292ce:/#
root@aa97ba3292ce:/#
了,这就意味着我们的镜像已经创建了一个容器实例。现在我们可以对这个“ubuntu系统”进行操作了root@aa97ba3292ce:/# apt-get install vim
Reading package lists... Done
Building dependency tree... Done
The following extra packages will be installed:
file libexpat1 libffi6 libgpm2 libmagic1 libpython2.7 libpython2.7-minimal libpython2.7-stdlib libsqlite3-0 libssl1.0.0 mime-support vim-common vim-runtime
Suggested packages:
gpm ctags vim-doc vim-scripts
The following NEW packages will be installed:
file libexpat1 libffi6 libgpm2 libmagic1 libpython2.7 libpython2.7-minimal libpython2.7-stdlib libsqlite3-0 libssl1.0.0 mime-support vim vim-common vim-runtime
0 upgraded, 14 newly installed, 0 to remove and 0 not upgraded.
Need to get 10.7 MB of archives.
After this operation, 50.7 MB of additional disk space will be used.
Do you want to continue? [Y/n]
想退出容器?很简单!
~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aa97ba3292ce chug/ubuntu14.04x64 "/bin/bash" 7 minutes ago Up 7 minutes relaxed_hoover
~$ docker start aa97ba3292ce
~$ docker stop aa97ba3292ce
~$ docker restart aa97ba3292ce
~$ docker attach aa97ba3292ce
软件装完,想保存环境?commit帮你!你这会是不是想起了git?commit -m“”?没错类似。
docker images
查看root@aa97ba3292ce:/#exit //先退出容器
~$ docker commit -m "ubuntu with vim" -a "sgy" aa97ba3292ce sgy/ubuntu:vim
~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sgy/ubuntu vim 52166e4475ed 5 seconds ago 358.1 MB
chug/ubuntu14.04x64 latest 0584b3d2cf6d 9 days ago
~$ docker run -it sgy/ubuntu:vim /bin/bash
root@520afc596c51:/# vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Apr 4 2017 18:14:54)
docker ps -a
查看。Failed to remove image (e4415b714b62): Error response from daemon: conflict: unable to delete e4415b714b62 (cannot be forced) - image has dependent child images
类似这种。~$ docker rm container_id
~$ docker rmi image_id
如何到处使用呢?“那我们把镜像放在U盘(docker库)上面”,那就push到hub上吧!
~$ docker push sgy/ubuntu:vim
docker login
登陆自己的账号,然后直接~$ docker pull sgy/ubuntu:vim
就可以把你push到hub的已经配置好的环境的镜像给扒下来。做完实验,再push上去就ok了!往期推荐
2020-03-25
2020-03-25
2020-03-25
2020-03-24
有道无术,术可成;有术无道,止于术
欢迎大家关注Java之道公众号
好文章,我在看❤️