Docker
流程图
Docker 是什么?
Docker 属于 Linux 容器的一种封装(容器)
仓库: 别人做好的现成的镜像,都放在仓库里
镜像: 自己要用哪个镜像,就先拉到本地来。镜像就相当于还没激活的容器。
容器: 容器就是跑起来的镜像,就是一个完整的工作环境
Docker 的主要用途?
(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
(可在普通服务器上建立上百个docker实例)
Docker 的安装?
容器与虚拟机比较?
什么是Docker仓库?
(1)仓库是集中存放镜像的场所
(2)仓库注册服务器上往往放着多个仓库,每个仓库又包含多个镜像,每个镜像 有不同的标签,仓库分为公开仓库(public)和私有仓库(private)
(3)push镜像到仓库,从仓库pull镜像
CentOS 上安装 Docker
yum -y update //更新yum资源
yum install docker -y //安装 Docker
systemctl start docker.service //启动 Docker
systemctl status docker.service //查看docker的状态,看到那个 active 就表示已经在运行啦
yum install iproute ftp bind-utils net-tools wget -y //围绕 Docker 的正常使用,还需要安装一些配套工具。
Docker在开发部署流程中的应用
提交镜像到仓库的步骤
- 注册账号
仓库位于 hub.docker.com 上,为了提交新的镜像,肯定要有账号才行,所以第一步是注册账号。
比如我就注册了名为lgc的账号。
注意: 这里命名很重要,因为在提交镜像的时候,由于不是官方的,必须在提交的时候用 : lgc/tmall 这样的命名格式,而不能简单地命名为tmall 。(标准化命名)
- 登录
这里说的登录,不是在 hub.docker.com 网站上,而是在 docker 后台进行登录。
docker login //后台登录docker
然后输入账号密码就行了。注意,账号不是邮箱地址哦,是lgc
- 将本地容器打包成本地镜像
(1)当是从仓库pull下来的镜像,并跑过环境时,在docker run()的时候会创建和命名一个容器-------->即是有容器名的情况是执行下面代码
docker commit 容器名 镜像仓库名:镜像标签名 //打包镜像放到本地(commit,对容器做了修改后,把改动后的容器,再次转换为镜像)
docker images //可以查看到你打包到本地镜像
docker tag 本地镜像仓库名(或用镜像id):本地镜像标签名 远程仓库名名:远程镜像标签名 //改成标准化名字
docker commit how2jtmall how2j/tmall:latest
docker images
docker tag how2j/tmall:latest how2j/tmall:now //改了标签名
docker images //再次查看本地镜像,发现已打包好镜像
这里的how2j相当于我的账号lgc,how2j只是用来演示,实际中要改成lgc
(2)当不知容器名时,执行下面的代码:
docker build -t how2j/webapp //使用docker build来编译镜像
//-t 用于给镜像做标签,/ 给容器做标签
docker images //再次查看本地镜像,发现已打包好镜像
docker login
docker tag cbe52807fcad lgc/webapp:latest //用tag改成用户名lgc否则拒绝访问,cbe52807fcad是镜像id
docker push lgc/webapp:latest // 推送镜像到仓库
- 推送镜像到仓库 (push)
docker push how2j/tmall:now
若用我的账号lgc
docker push lgc/tmall:now
从仓库Pull镜像,并跑起来
- 配置dns
DNS设置是什么?有什么作用?
dns只是用作域名解析的,即把你输入的网址解析成为ip地址,然后通过ip地址去访问。
其实你设置的DNS地址也是个服务器.上面存储了好多网站名字和具体的IP地址对应关系.设置了DNS你就可以直接从服务器那里获取你要访问的网站的IP地址,否则,你要上网站,你的电脑就会找不到你要的站,当然也上不了.
nslookup www.baidu.com //发现它使用的域名服务器地址是192.168.84.2
这样是不行的,后面 docker 运行会出问题。
所以我们把它改为公用的域名服务器地址,这里选用腾讯的公共DNS地址119.29.29.29
vi /etc/resolv.conf
# Generated by NetworkManager
search www.tendawifi.com
nameserver 119.29.29.29
nameserver 182.254.116.116
nslookup www.baidu.com //可以看到此时域名服务器地址已经是 119.29.29.29 了
- 配置镜像加速器
hub.docker.com 在国外,要拉到本机会比较卡。为了提高网络速度,我们需要配置镜像加速器。
直接运行如下代码:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://hvmf8r55.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker //重启docker
然后通过如下命令查看 daemon.json 是否已经生效了
tail /etc/docker/daemon.json
- 拉取镜像
docker pull how2j/tmall //从 hub.docker.com 上拉下来镜像
- 运行镜像
docker run -dit --privileged -p21:21 -p80:80 -p8080:8080 -p30000-30010:30000-30010 --name how2jtmall how2j/tmall:latest /usr/sbin/init
这个命令看着长,其实不难,我挨个挨个来给大家分解:
(1)docker run 表示运行一个镜像
(2)-dit 是 -d -i -t 的缩写。 -d ,表示 detach,即在后台运行。 -i 表示提供交互接口,这样才可以通过 docker 和 跑起来的操作系统交互。 -t 表示提供一个 tty (伪终端),与 -i 配合就可以通过 ssh 工具连接到 这个容器里面去了
(3)–privileged 启动容器的时候,把权限带进去。 这样才可以在容器里进行完整的操作
(4)-p21:21 第一个21,表示在CentOS 上开放21端口。 第二个21 表示在容器里开放21端口。 这样当访问CentOS 的21端口的时候,就会间接地访问到容器里了
(5)-p80:80 和 21一个道理
(6)-p8080:8080 和21 一个道理,在本例里,访问的地址是 http://192.168.84.128:8080/tmall/, 这个 192.168.84.128 是CentOS 的ip地址,8080是 CentOS 的端口,但是通过-p8080:8080 这么一映射,就访问到容器里的8080端口上的 tomcat了
(7)-p30000-30010 和21也是一个道理,这个是ftp用来传输数据的
(8)–name how2jtmall 给容器取了个名字,叫做 how2jtmall,方便后续管理
(9)how2j/tmall:latest how2j/tmall就是镜像的名称, latest是版本号,即最新版本
(10)/usr/sbin/init: 表示启动后运行的程序,即通过这个命令做初始化
- 检查端口
netstat -anp|grep 8080 //可以发现8080端口被启动了,而且是交给了 docker 在使用~~~
- 访问项目地址
http://192.168.84.128:8080/tmall/
ip address //获取ip地址(看ens33)
跑起来之后,只有图片,没有数据,研究了一下。。。发现是容器里数据库起慢了导致的,需要重启tomcat才可以解决。 解决步骤:
(1)先进入容器(就是进入启动的 运行Tomcat的Linux)
docker exec -it 容器名 主目录名
docker exec -it how2jtmall /bin/bash
使用 attach会卡死,所以用exec。。。
(2)然后重启 tomcat
/usr/local/tomcat8/bin/shutdown.sh //注意所在目录
/usr/local/tomcat8/bin/startup.sh
exit //退出容器
容器的常用操作
docker ps -a //查询所有的容器
docker rm how2jtmall //删除容器,how2jtmall是容器名
网络恢复
虚拟机一旦重启,或者关机过,那么就会出现可以访问 Linux,但是无法访问里面的 Docker的情况。 可以在 CentOS里做如下事情:
vi /etc/sysctl.conf
或者
vi /usr/lib/sysctl.d/00-system.conf
添加如下代码:
net.ipv4.ip_forward=1
重启network服务
systemctl restart network
查看是否修改成功
sysctl net.ipv4.ip_forward
如果返回为“net.ipv4.ip_forward = 1”则表示成功了
喜欢的朋友可以关注我的个人公众号,后台回复java资料可免费领取资源。