Docker入门

马修 2021-01-21 15:57:08
docker 腾讯云 入门 技术开发


入门Docker,你要下载什么?注册什么?

Docker安装好,账号也注册后,点击桌面顶栏的Docker图标,点击sign in,登录你的Docker账号。

  • 注册DaoCloud账号,获取加速服务! 不可否认,有时直接从Docker官方往本地pull镜像会十分缓慢。。。这时我们可以通过国内的Docker服务提供商免费获取加速pull镜像服务,阿里网易好像都有这种服务,我选择的是DaoCloud:点我注册DaoCloud账号

注册后登录DaoCloud,找到这个按钮

接着,按照它的步骤,为自己添加Docker加速服务

  • 到此准备工作结束,进入下一部分!

要想入门Docker,首先你需要理解Docker!

我也不扯淡了,直接上我对Docker的理解:

Docker,可以说是一个终端命令行的虚拟机,但更准确的说法,其实应该是一个虚拟环境。比如,你想要在PC上无缝使用Linux么?那么虚拟机并不是你唯一的出路,你还有Docker!我更愿意称Docker为一个容器,当然这只是Docker的一个狭义解释,Docker不止是一个容器。Docker包含3个重要概念:

  • 一个,是镜像(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仓库都是公共的。当然,每个免费用户有一个名额把自己的一个镜像设为私有,也就是禁止被分享给别人,类比百度云上你自己保存的而没有被生成分享链接的小姐姐。

接下来来张高大上的概念图,各位看个热闹2333

接下来就是实战了

打开你的iTerm2!(打开普通terminal也行,这个不影响)

  • 查看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
...
//omitted by sgy(Copyright http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)
...

不过我一般不需要那么多信息,所以一直用的是docker -v命令

  • 是时候pull你的第一个镜像下来

Docker安装好后是不会自带镜像的,你需要从仓库自己pull一个镜像下来,自己制作自己的镜像也是一个道理,你可以通过在已有的镜像基础上生成自己的镜像或者看一下这篇博客: 随便百度的如何创建自己Docker镜像得到的教程 Docker镜像官方好像只提供Linux,这个很容易想,windows和mac是要交钱的吧大概?

搜索ubuntu的Docker镜像docker search ubuntu,这个如果你想要什么centos,直接改就行,不区分写法,我的返回结果:

~$ 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]
...
//omitted by sgy(Copyright http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)
...

拉取官方最新版的ubuntu镜像: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的镜像。

由于我的lab统一要求,ubuntu需要14.04版本,所以我在hub里面搜了搜,找到了一个用户分享的14.04 64位纯净镜像(base image),下面将他的镜像扒下来

~$ docker pull chug/ubuntu14.04x64

这个用户还有很多其他版本的ubuntu系统,12 13 14的32位64位都有,全是纯净镜像。

  • 查看你本地的镜像仓库!

把初始镜像拉下来后,就可以启动它了,不过,可以先使用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标记信息。

  • 启动你的镜像并尽情安装软件吧!

以下内容均以我自己pull下来的chug的初始镜像为例:

现在你已经有一个初始的镜像了,注意这个里面是什么都没有的,连vim都没装,是精简到不能再精简的镜像了。

首先启动它:

~$ docker run -it chug/ubuntu14.04x64 /bin/bash
root@aa97ba3292ce:/#

-it 表示运行在交互模式,是-i -t的缩写,即-it是两个参数:-i和-t。前者表示打开并保持stdout,后者表示分配一个终端(pseudo-tty)一般这个模式就是可以启动bash,然后和容器有命令行的交互

可以看到我们终端的字头变成root@aa97ba3292ce:/#了,这就意味着我们的镜像已经创建了一个容器实例。现在我们可以对这个“ubuntu系统”进行操作了

比如安装vim:

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]

看到我没有用sudo,是因为本来就已经是超级用户(root)状态了。

同理按照我自己的需求,我安装了gcc和gdb

  • 想退出容器?很简单!

如果使用exit,命令退出,则容器的状态处于Exit,而不是后台运行。如果想让容器一直运行,而不是停止,可以使用快捷键 ctrl+p ctrl+q 退出,此时容器的状态为Up。

查看当前正在运行的容器:

~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aa97ba3292ce chug/ubuntu14.04x64 "/bin/bash" 7 minutes ago Up 7 minutes relaxed_hoover

看到当前有一个ID为aa97ba3292ce的容器。启动、停止、重启容器aa97ba3292ce的命令:

~$ docker start aa97ba3292ce
~$ docker stop aa97ba3292ce
~$ docker restart aa97ba3292ce

后台启动一个容器后,如果想进入到这个容器,可以使用attach命令:

~$ docker attach aa97ba3292ce
  • 软件装完,想保存环境?commit帮你!

将容器转化为一个镜像,即执行commit操作,完成后可使用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 196.5 MB

其中,-m指定说明信息;-a指定用户信息;aa97ba3292ce代表容器的id;sgy/ubuntu:vim指定目标镜像的用户名、仓库名和 tag 信息。我这里都是为了博客瞎编的用户名,我自己的用户名也不是sgy,你运行命令的时候使用自己注册Docker时的用户名。

此时Docker中就有了我们新建的镜像sgy/ubuntu:vim,此镜像和原有的ubuntu镜像区别在于多了个vim工具。此时我们利用新镜像创建的容器,本身就自带vim了。

启动新创建的镜像,可以看到vim已经自带了。

~$ 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)
...
//omitted by sgy(Copyright http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)
...

利用exit退出容器。此时Docker引擎中就有了两个容器,可使用docker ps -a查看。

  • 想要删除容器或者镜像?用这个!

如果想删除容器或者镜像,可以使用rm命令,注意:删除镜像前必须先删除以此镜像为基础的容器(哪怕是已经停止的容器),否则无法删除该镜像,会报错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

有的时候尽管删除了全部容器,镜像还是无法删除,这时点击mac顶栏中的docker logo,选择restart,然后再试一次rmi,应该就没问题了。

  • 附上一张高大上的Docker命令图

  • 一次配置,到处使用?那就push到hub上吧

因为之前已经在Docker.app中登录了Docker账号,所以现在直接

~$ docker push sgy/ubuntu:vim

就可以了! 下次到了机房,在ubuntu系统中安装Docker,配置好加速器,启动Docker,docker login登录自己的账号,然后直接~$ docker pull sgy/ubuntu:vim就可以把你push到hub的已经配置好的环境的镜像给扒下来。做完实验,再push上去就ok了!

Docker中安装gcc、gdb时遇到的问题

  • add-apt-repository: command not found

14.04系统解决办法:

apt-get install software-properties-common

older版本的系统:

apt-get install python-software-properties
  • Docker中使用gdb无法进入断点,无法调试

加上--privileged参数

~$ docker run -it --privileged sgy/ubuntu:vim /bin/bash

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

版权声明
本文为[马修]所创,转载请带上原文链接,感谢
https://cloud.tencent.com/developer/article/1777484

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云