docker(一)

一、引入docker

    docker发展到现在已经非常普及了,首先我们需要了解为什么docker发展如此之快。docker的发展是由于云计算的发展,并且伴随着SRE推动devops这两方面的原因。

    docker在概念上非常的干净,如下图。蓝色的鲸鱼是一台服务器,上面的集装箱就是docker容器。

    为了刚好的理解docker,我们和虚拟机、git比较一下:

    docker vs vm:虚拟机是需要安装一个完整的操作系统,一般我们是采用VMware、virtual box等软件在我们的操作系统上安装虚拟机,在我们安装虚拟机的过程和在裸机上安装操作系统没什么区别。docker容器只是一个进程,每一个容器都是一个隔离的空间,docker启动速度很快,但是操作系统启动就很慢了。docker和vm都是虚拟化的产物,docker是进程级虚拟化,vm是系统级虚拟化。

    docker vs git:git是代码仓库,docker更像是可执行文件+运行环境。

    docker解决了哪些痛点问题:

    对运维工程师来说,发布时部署环境搭建、依赖包版本都搞定了,适用docker技术再加上devops的思想指导,运维工程师在这一点上的工作的极大解放了

    docker本身所带来的突破我认为仅仅就这些,所以我在2016年的时候就觉着纯粹docker对其他开发语言或许有用,但是对于java工程师没有半毛线关系,毕竟tomcat本身就是servlet容器,spring boot直接是一个可执行jar包。但是docker的潜力是无限的:

    1. docker + mesos:docker和mesos相结合简化了发布,简化了发布流程

    2. docker + k8s:k8s简直就是运维界绝世神兵,集成了非常优秀的发布、运维、资源调度等等功能

 

二、docker现状

    我谈一下蚂蚁金服当前k8s当前的状态,由于我不是SRE,我了解到的情况也不是非常的全面。现在绝大多数的程序都是运行在docker中,应用目前逐渐有内部的调度平台切换到k8s。

 

三、一步步使用docker

1、安装环境

    首先我准备了一台ubuntu16的虚拟机,更新了apt源、升级了apt软件版本、安装了vim、ssh这些基本工具,切出一个新分支docker。

安装docker:

sudo apt install docker.io

测试:

root@ubuntu16server:/home/yufeiliu# docker -v
Docker version 18.09.5, build e8ff056

2、理解docker中的基本概念

    docker中有三个概念:镜像、容器、仓库。我们一般的套路是基于一个基本镜像出发,比如ubuntu镜像,我们把镜像启动起来就是容器,这个容器里面只有几个默认进程在跑,我们在这个容器上面可以安装jdk、安装tomcat并且把这个容器保存成为新的镜像,新镜像保存在本地仓库,当前我们也可以把镜像推到远程仓库。

    镜像:是一个可执行文件+运行环境

    容器:把镜像启动就是容器,容器是暂态存在,容器跟线程差不多,启动起来就在跑,我们可以进到容器中看看运行情况。比如我们现在只是安装了jdk+tomcat这个容器虽然没什么用,但是扩展性很强,所以把这种状态保存下来。为后续做准备。就和上面我的vmware我是费了点功夫初始化虚拟机,为了不破坏当前环境,单独做了一个快照。

    仓库:镜像可以直接被保存成为文件,但是一般不这么做。我们采用本地仓库+远程仓库的方式用于镜像共享。这个和maven的仓库是一个思路。常用的远程仓库也是默认仓库dockerhub。

3、镜像

查看本地仓库中的镜像:

root@ubuntu16server:/home/yufeiliu# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

我们刚安装上,所以本地仓库中没有镜像。

查看docker信息:

root@ubuntu16server:/home/yufeiliu# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 18.09.5
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version:
runc version: N/A
init version: v0.18.0 (expected: fec3683b971d9c3ef73f284f176672c44b448662)
Security Options:
 apparmor
 seccomp
  Profile: default
Kernel Version: 4.4.0-147-generic
Operating System: Ubuntu 16.04.6 LTS
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.366GiB
Name: ubuntu16server
ID: L5JK:26SF:AVTW:35BO:C2NS:SOIX:WACV:VEBJ:X7ME:GNYQ:MGXD:7D4E
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

我们发现Registry: https://index.docker.io/v1/,默认远程仓库是dockerhub,我们先在dockerhub上找几个常用的镜像下载下来玩一下。

root@ubuntu16server:/home/yufeiliu# docker pull nginx:1.15.12
1.15.12: Pulling from library/nginx
743f2d6c1f65: Already exists
6bfc4ec4420a: Waiting
688a776db95f: Waiting

下载经常性失败,所以使用国内的dockerhub,这里采用阿里云。

首先先登录:

docker login registry.aliyuncs.com

登录之后就会把信息保存在本地,只需要登录一次就可以了,今后不需要再登陆。

按照文档修改镜像源,改完之后我们看一下信息:

root@ubuntu16server:/home/yufeiliu# docker info
Containers: 5
 Running: 0
 Paused: 0
 Stopped: 5
Images: 1
Server Version: 18.09.5
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk sy                                                                                                             slog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version:
runc version: N/A
init version: v0.18.0 (expected: fec3683b971d9c3ef73f284f176672c44b448662)
Security Options:
 apparmor
 seccomp
  Profile: default
Kernel Version: 4.4.0-147-generic
Operating System: Ubuntu 16.04.6 LTS
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.366GiB
Name: ubuntu16server
ID: L5JK:26SF:AVTW:35BO:C2NS:SOIX:WACV:VEBJ:X7ME:GNYQ:MGXD:7D4E
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Username: yufeiliu
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Registry Mirrors:
 https://pit4jkxd.mirror.aliyuncs.com/
Live Restore Enabled: false

说明已经修改好了,我们再次下载:

root@ubuntu16server:/home/yufeiliu# docker pull nginx:1.16.0
1.16.0: Pulling from library/nginx
743f2d6c1f65: Already exists
375084df5778: Pull complete
6976b5e9656a: Pull complete
Digest: sha256:f950ede81138cd1d94d9d46505678c1046c007d949f9006430752615deb5008a
Status: Downloaded newer image for nginx:1.16.0
root@ubuntu16server:/home/yufeiliu#
root@ubuntu16server:/home/yufeiliu#
root@ubuntu16server:/home/yufeiliu#
root@ubuntu16server:/home/yufeiliu# docker pull mysql:5.6
5.6: Pulling from library/mysql
743f2d6c1f65: Already exists
3f0c413ee255: Pull complete
aef1ef8f1aac: Pull complete
f9ee573e34cb: Pull complete
3f237e01f153: Pull complete
c834d5397c17: Pull complete
167b4b0bb213: Pull complete
8e13de731ad8: Pull complete
0dcd497f8ff9: Pull complete
82d36065c763: Pull complete
f30363b0dfa6: Pull complete
Digest: sha256:8547945d0e59b747c768e9d2bec3629ee2699837705457c3350709219b8c6ff4
Status: Downloaded newer image for mysql:5.6

我们下载了nginx、mysql。

root@ubuntu16server:/home/yufeiliu# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               1.16.0              18ff9f3390d6        47 hours ago        109MB
nginx               1.15.12             53f3fd8007f7        47 hours ago        109MB
mysql               5.6                 73829d7b6139        2 days ago          256MB
ubuntu              latest              d131e0fa2585        13 days ago         102MB

到现在为止我们使用了两个命令:

docker login
docker pull

完成了从远程仓库拉取镜像的事情。下面我需要着重讲一下镜像的坐标,每一个镜像都使用REPOSITORY/IMAGE:TAG唯一确定一个镜像,其中REPOSITORY如果不写就是registry.hub.docker.com,每一个镜像都有一个唯一的imageID,也可以唯一确定一个镜像,一般我们都采用REPOSITORY/IMAGE:TAG这种方式。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值