容器技术docker入门
docker是什么
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
docker与虚拟机
docker与虚拟机- 最明显是Guest OS,docker没有虚拟化内核,使用宿主内核。
- 虚拟机能做的,docker不一定能做,反之亦然。目前来说虚拟机可做的事情大于docker。
- docker的特性在于轻量。如果在虚拟机中维护好几个内核,必然启动、运行速度都会很慢,但是很多场景,是不需要关注内核的,比如下载jenkins安装包,安装数据库等。这是docker轻量级、docker秒启动的原因。
- 一台服务器可能只能挂几个虚拟机。一台服务器上可以启动上百个docker都没问题。
- docker是怎么保证各个容器互相隔离?
因为docker的核心技术:Namespace、联合文件系统、Cgroups帮助docker隔离不同级别的东西
Namespace,网络名称空间,隔离网络机制,两个Namespace是网络完全隔离,无法通信的。除非通过端口映射出来。
联合文件系统,给每个容器提供单独的视图,所以只能访问该容器中的文件,达到文件隔离。
Cgroups,达到资源隔离,每个容器申请固定的资源。 - 共用一个内核的缺点,如果一个容器把内核搞挂了,其他容器也挂了。但是一般不会搞挂,哈哈。
docker下载、安装
- docker下载地址,选择mac/win版:https://www.docker.com/products/docker-desktop
- 安装(mac)
下载的.dmg文件,双击安装,拖动小图标到应用程序即可。
docker 镜像管理命令
- docker pull image_name [:tag]
拉取镜像,不写tag默认最新版本latest
- docker push image_name
推送镜像 - docker images
查看当前机器所有镜像 - docker rmi image_name /image_id
删除当前机器的一个镜像 - docker tag source_images_name:tag your_images_name:tag
为一个镜像打上tag
原本的镜像的源版本是不可修改的,只能给它打tag,增加新的版本
docker tag jenkens:latest jenkens:5.5
docker tag jenkens:latest myjenkens:5.5
新增了一个版本,但是它的image_id都是一样的,说明不是新增一个镜像。 - docker save busybox>busybox.tar
当前已有镜像保存:docker save jenkins>myjenkins.tar
- docker load < busybox.tar.gz
本地下载好.tar包,加载镜像:docker load <jenkins.tar
- 在哪里拉取镜像?
世界上最大的镜像仓库,docker hub:https://hub.docker.com/
国内镜像仓库:
(1)中国科学技术大学:http://docker.mirrors.ustc.edu.cn
(2)docker官方中国区: http://registry.docker-cn.com
(3)网易:http://hub-mirror.c.163.com
docker hub拉取镜像太慢了,添加国内镜像地址。
请使用http
,不要用https
,“No certs for egitstry.docker.com”。
- 如何选择镜像呢?例:jenkins
搜索栏进行搜索,第一个是官方提供的jenkins镜像:
点击进去也会有更详细的说明文档:
右侧也会有拉取镜像的命令:docker pull jenkins
第一次拉取会比较慢,需要下载。
安装完成:✅
docker 容器管理命令
- docker run jenkins
通过一个镜像启动一个容器
docker run -p 8080:8080 -p 50000:50000 jenkins
端口映射,就是将宿主机的8080端口映射到容器的8080端口上。通过访问宿主机的8080端口,将请求转发到容器的8080端口
- 是否可以后台运行?默认情况,网断或者shell交互关闭,容器都会挂掉。
docker run -d jenkins
后台运行了,查看docker启动日志
docker logs -f
- 让容器使用我自己命名的名字作为容器名称
docker run -d --name myjenkins jenkins
- docker ps
列出所有正在运行的容器
- 列出所有容器
docker ps -a
- 新增一列SIZE,代表当前容器占用的容量
docker ps -a -s
-
docker stop CONTAINER_Name
停止容器 -
docker rm CONTAINER_Name
删除容器
- 先停止再删除,麻烦!
强制删除容器docker rm -f CONTAINER_Name
-
docker kill CONTAINER_Name
杀死容器,不会等待容器结束 -
docker run -d --name myjenkins -p 8080:8080
前面讲了,Namespace技术,使得各个容器间网络隔离,无法通信,宿主机也无法使用,除非使用端口映射。
端口映射,就是将宿主机的8080端口映射到容器的8080端口上。通过访问宿主机的8080端口,将请求转发到容器的8080端口
127.0.0.1:8080可以访问jenkins
需要初始密码,启动logdocker logs -f
有初始密码 -
数据卷(Data Volume)
存在容器中的数据会随着容器的删除、节点有问题而丢失。这是我们不愿意看到的。希望在容器中保存的数据能够持久化出来。用数据卷可以解决这个问题。
-v 宿主机目录:容器目录
命令,把宿主机上的某个目录挂载容器上 ,容器文件目录也映射到宿主机,即使容器删除,文件也还是保存在宿主机上的。
ps:注意挂载权限 sudo chown -R 1000:1000 /home/docker/jenkins -
docker info
查看docker服务的信息 -
docker inspect CONTAINER_Name
查看容器元数据
与容器交互的命令
- docker exec
是在容器中去执行一条命令
-
docker exec -it jenkins bash
登录容器
-it
是启动虚拟的shell交互,shell交互去运行bash,才可以登录到容器里面 -
docker exec jenkins echo "hello world"
在容器jenkins中打印hello world -
docker exec jenkins ping www.baidu.com
在容器jenkins中ping百度
- ps aux|grep jenkins
在容器中是看不到别的容器和宿主机的,但是docker留了一个口子,可以用宿主机看到容器。 - docker cp CONTAINER_Name:CONTAINER_PATH HOST_PATH
把主机上的一个文件copy到容器中
拓展
联合文件系统:
x空间目录有A文件,Y空间目录有B文件,通过视图可以看到所有空间的所有文件,这个视图就是联合文件系统。这个视图里就要A、B文件。
在视图层中对A文件中加一行“hello”,同步到x空间中的A文件,在视图中对B文件中加一行“world”,在y空间并不会同步,而是在x空间记录“对B文件增加world这个字符串”,即记录对B文件的修改,原因是联合文件系统,只有链接的第一个目录有读写权限,其他目录只有读权限。
即无法修改的是镜像层,记录镜像层的修改是容器层,可以操作的是视图层。登录容器时,就是视图层。
把容器层叠加到镜像层,上层都是记录的对下层的修改。新的容器层继续记录对镜像层的修改。可以一直叠加。所以删除镜像时,是删除多层镜像,是一层一层删除的。
-
为什么要使用多层镜像呢?提高复用性,节省空间。
假设jenkin每层是这样,如果我想直接复用centos,上层装python、node.js,可以直接使用。
制作镜像
- 制作镜像的命令:
docker commit myjenkins myjenkins:5.5
制作新的命名为myjenkins的镜像,tag是5.5 - Dockerfile文件,docker官方推荐的制作镜像的方式
启动命令扩展
docker run -d --name myjenkins --net host jenkins
使用宿主机的网络启动jenkins