Docker基操
一、什么是Docker
你问我什么是docker,讲真,谈概念我还真不是太清楚,我们只要知道它能做什么就ok了。举个例子,我想要安装一个java环境,常规的操作是到官网上下载最新的jdk,然后到本地安装,配置环境、安装插件等一系列复杂的操作,但众所周知的一点是,java环境的安装真的是一件坑爹事。那么为了简化见事,我们就可以使用Docker,直接docker search java
然后选择自己需要的版本,然后docker pull yourjavarepository
,最后docker run yourjavarepository
我们的java环境就跑起来了。
按照我的理解,docker提供给了我们最精简、最直接、最方便的安装方法,所有额外的操作都被提前封装在了repositry中,我们要做的只是简单的找到应用,然后让他跑起来就好了。接下来我要搬运菜鸟教程上关于docker的介绍了。
FROM RUNBOO
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
阅读本教程前,您需要了解的知识
在阅读本文章前,你需要掌握 Linux 的常用命令。你可以通过runboo的 Linux 教程 来学习相关命令。
Docker的应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
Docker 的优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
1、快速,一致地交付您的应用程序
Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
2、响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
3、在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
二、Docker中你要了解的概念
2.1 仓库
字面理解,仓库中可以存放镜像,所有的镜像都可以被推送到仓库中,哪怕是你自定义的镜像
2.2 镜像
镜像是一个模板,通过同一个镜像我们可以映射出来很多个的容器,可以将镜像理解成为一个模具,我们生产产品,只需要依葫芦画瓢就可以了。按面向对象编程的概念,镜像就是一个类。
2.3 容器
容器是具体运行的实例,我们需要的服务就运行在容器中,相当于面向对象中的对象,是通过类进行实例化产生的。他包含一整套的运行环境。
三、安装并启动你的Docker
3.1 自动化脚本安装
- 使用官方自动化脚本安装
curl -fsSL https://get.docker.com | bash -s docker --mirror aliyun
- 使用国内源安装
curl -sSL https://get.daocloud.io/docker | sh
3.2 手动安装
3.2.1 卸载旧版本
安装前应该卸载旧版的docker。
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
3.2.2 设置仓库
3.2.2.1 安装配套软件包
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
3.2.2.2 配置仓库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
3.2.3 使用官方源安装
sudo yum install docker-ce docker-ce-cli containerd.io
安装过程中会提示是否同一GPG密钥,记得选是
3.3 启动Docker
systemctl start docker
使用这条命令查看docker运行状态
systemctl status docker
当出现绿色active字样表示docker安装完毕
四、使用Docker容器
4.1 基本使用流程
搜索容器
现在我们需要一个提供网站服务端,首先我们输入
docker search httpd //在docker hub中搜索http
拉取镜像
我们选择收藏量最大的镜像拉取
docker pull httpd
拉取过程中我们注意到,docker镜像是分层拉取的,就像PS中的图层的概念一样,各层之间互相不影响,我们要修改镜像只需要在上面添加新的层就可以了。且docker的层是可以复用的,如果两个镜像使用了相同的层,那么这个相同的层是不胡会被重复下载的。
查看镜像列表
使用下面命令查看docker镜像
docker images //老版本的用法
docker image ls //新版本用法
可以看到我们刚刚拉取的镜像出现了,各字段从左到右表示,镜像名、标签、镜像ID、创建时间、尺寸。
运行一个容器
然后我们让这个镜像跑起来
docker run -it -d --name httpdserver -P httpd
该命令运行成功过回显的是新建容器的id,我们使用容器的时候可以使用id直接调用也可以使用容器名。容器的id支持缩写调用。
选项及含义
选项 | 含义 |
---|---|
-i | 交互式运行 |
-t | 打开一个终端 |
-d | 后台运行 |
–name | 给容器取一个名字 |
-P | 将容器的端口映射到主机,要映射的端口在dokerfile中设置,或者使用-p指定 |
-p | 指定要映射的端口 格式:-p:6666:80/tcp,表示将容器的80端口映射到主机的6666端口,并使用tcp协议 |
查看容器列表
此时我们使用下面命令查看新建的容器
docker ps //显示所有正在运行的容器
docker ps -a //显示所有容器
container id | image | command | created | status | ports | names |
---|---|---|---|---|---|---|
容器id | 使用的镜像 | 命令 | 创建时间 | 状态 | 端口映射 | 容器名 |
运行测试
使用浏览器访问49153端口
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210529212144347.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMyNzMxMDc1,size_16,color_FFFFFF,t_70)
可以看到容器已经正常运行了
镜像复用
我们可以使用一个镜像运行多个容器
可以看到现在已经有两个容器在运行了,且第一个容器的端口是我们手工指定的
登录容器
这时我们想要登录容器的bash环境,执行一些命令怎么办?我们输入
docker exec -it fc68 /bin/bash #以交互的方式登录容器,退出容器后容器不会停止
docker attach -it fc68 /bin/bash #以交互的方式登录容器,退出容器后容器停止
退出容器
输入exit退出当前容器!!!!
root@fc68af143eb6:/usr/local/apache2# exit
停止容器
现在我么想停止id为fc68af143eb6的容器,我们输入
docker stop fc68
docker kill fc68
再查看当前正在运行的容器
可以看到id为fc68af143eb6的容器不见了,但该容器仍然存在,我们使用docker ps -a
查看
启动容器
使用下面命令重新运行容器
docker start fc68
可以看到容器重新恢复了
重启容器
如果想重启容器呢?输入
docker restart fc68
删除容器
现在我不想要容器了,我怎么删除呢
docker rm -f fc68 #-f 强制删除,不管容器当前是否在运行
如果我想删除所有容器,输入
docker rm -f $(docker ps -aq)
查看容器详细信息
docker inspect fc68
注意这里的ip地址,待会儿我们会用到
导出容器
为容器拍一个快照
docker export fc68 > httpsnap.tar
我们看到容器被打包成一个文件存储在了本地
导入容器
cat httpsnap.tar | docker import - armandhe/httpsnap:v1.1
可以看到形成了一个新的镜像
五、容器间通信
5.1 使用docker0网卡通信
生成一个容器的时候会成对得生成evth-pair网卡,使得容器与容器之间可以相互通信
所有的容器在不指定网络的情况下,都是由docker0进行路由的,docker会为每一个容器分配一个可用的ip
物理机网卡与docker通过NAT直连
容器重启之后,ip地址可能发生变化,那么容器之间通过ip进行通信的话,就需要重新进行配置,这不是我们需要的效果。所以通过—link将两个容器连接起来,无论ip怎么变化,只要容器的名称-服务名不变,那么两个容器之间就仍然可以正常通信。
docker run -d -P —name "docker0-link1" httpd
docker run -d -P —name "docker0-link2" —link docker0-link1 httpd
docker exec-it docker0-link2 ping docker0-link1 #ok
docker exec -it docker0-link1 ping docker0-link2 #no
#如果需要docker0-link1能够通过服务名ping通docker0-link2需要为docker0-link1也设置—link
#这种通信方式的本质是在hosts文件中配置了域名,所以我们可以到登录到docker0-link1中去在host文件中配置使得docker0-link1能ping通docker0-link2
#我这儿翻车了,我安装的镜像没有ping命令,还下载不了..........
5.2 自定义网络
创建一个网络
docker network create —driver bridge —subnet 192.168.100.0/24 —gateway 192.168.0.1 docker-net-bridge
可以看到我们新建的网络出现了
查看该网络的详情
创建容器
然后在运行容器的时候指定,指定容器运行在这个命名空间上
docker run -d -P --name "container_mynet_01" --net docker-net-bridge httpd
docker run -d -P --name "container_mynet_02" --net docker-net-bridge httpd
测试网络连通性
docker exec -it container_mynet_01 ping container_mynet_02 #ok
docker exec -it container_mynet_02 ping container_mynet_01 #ok
六、我要自己造轮子-创建自己的镜像
6.1 使用现有镜像
首先我们登录我们刚才新建的容器,运行apt upgrade
更新容器,然后退出容器,运行
docker commit -m="some update by armandhe" -a="armandhe" b02 armandhe/httpd-lastest:v1.1 //创建了一个新的镜像
运行docker images
查看镜像列表
登录我们的docker hub
账号
docker login
推送我们自己的镜像到仓库
docker push armandhe/httpd-lastest:v1.1
登录docker hub查看镜像
6.2 Dockerfile
编解dokerfile
#####touch Dockerfile
FROM centos:6.7
MAINTAINER armandhe "www.armandhe.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd armandhe
RUN /bin/echo 'armandhe:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
构建镜像
docker build -t armandhe/centos:6.7 .
.表示Dockerfile所在的目录,这儿在当前目录,如果在别的目录,需对应进行更改。
查看新生成的镜像
源于Dockerfile的语法,请自行RUNBOO,我也不会…hahhahahhahaha