Docker概述
发布项目=jar+(Redis+MySQL+jdk+ES),需要配置对应环境
Docker解决(集装箱思想):
- java–>apk–>发布(应用商店)–> 张三使用apk–>安装即可用
- java–>jar (环境)–>打包项目带上环境(镜像 )–>( Docker仓库:商店 )–>下载发布的镜像–>直接运行
Docker核心思想:打包装箱,且每个箱子是互相隔离的。
Docker 是基于 Go 语言开发的开源项目
文档地址 : https://docs.docker.com/
仓库地址 : https://hub.docker.com/
虚拟化技术:
- 虚拟机:在window中装一个Vmware,通过这个软件可以虚拟出来一台或者多台电脑,稍显笨重
- 资源占用十分多
- 冗余步骤多
- 启动很慢
- Docker容器技术:不是模拟的一个完整的操作系统
Docker 和 虚拟机技术的不同:
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在 宿主机的内容,容器是没有自己的内核的,也没有虚拟硬件,所以就轻便了。每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响。
DevOps (开发、运维)
- 应用更快速的交付和部署
- 传统:一堆帮助文档,安装程序
- Docker : 打包镜像发布测试,一键运行
- 更便捷的升级和扩缩容:使用了Docker之后,部署应用就和搭积木一样。项目打包为一个镜像,扩展 服务器A、服务器B
- 更简单的系统运维:在容器化之后,开发,测试环境都是高度一致的。
- 更高效的计算资源利用:Docker 是 内核级别的虚拟化,可以在一个物理机上可以运行很多的容器实例。服务器的性能可以被压榨到极致。
Docker的基本组成
- 镜像(image ) :docker镜像好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===> run ==> tomcat01 容器(提供服务器),通过这个镜像可以创建多个容器( 最终服务运行或者项目运行就是在容器中的 )。
- 容器( container) :Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。启动,停止,删除,基本命令。目前把容器理解为一个简易的linux系统
- 仓库(repository) :存放镜像的地方。分为公有仓库和私有仓库。Docker Hub( 默认是国外的),阿里云有容器服务器(用于配置镜像加速)
Docker的安装
- 环境准备:Linux+CentOs 7+Xshell
- 环境查看
# 系统内核是 3.10 以上的
[root@kuangshen /]# uname -r
3.10.0-1062.12.1.e17.x86_64
# 系统版本
[root@kuangshen /]# cat /etc/os-release
NAME="Centos Linux'
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="Centos Linux 7 (Core)"ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos :centos :7"
HOME_URL="https ://www.centos.org/"BUG_REPORT_URL="https ://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="Centos-7"
CENTOS_MANTISBT_PROJECT_VERSION=""
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION-"7
# 1、卸载旧的版本
yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-Togrotate
docker-engine
# 2、需要的安装包
yum insta11 -y yum-utils
# 3、设置镜像的仓库
yum-config-manager
--add-repo
https://download.docker.com/1inux/centos/docker-ce.repo # 默认是从国外的
yum-config-manager
--add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 推荐使用阿里云的
# 更新yum软件包索引
yum makecache fast
# 4、安装dokcer docker-ce 社区 ee 企业版
yum insta11 docker-ce docker-ce-cli containerd.io
#5、启动docker
systemctl start docker
# 6、使用docker version 是否安装成功
# 7、hello-world
docker run hello-world
Docker的卸载
# 1、 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2、删除资源
rm -rf /var/lib/docker
# docker的默认工作路径
阿里云镜像加速:
- 登录阿里云找到容器服务
- 找到镜像加速地址
- 配置使用
sudo mkdir -p wetc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https ://qiyb9988.mirror.aliyuncs.com"]
}
EOF
sudo systemct] daemon-reload
sudo systemct] restart docker
Docker工作的底层原理
Docker 是一个 Client- Server 结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问。DockerServer 接收到 Docker-Client 的指令,就会执行这个命令
Docker 为什么比 VM 快?
1、Docker有着比虚拟机更少的抽象层
2、docker 利用的是宿主机的内核,vm 需要是 Guest OS
新建一个容器的时候docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载 Guest OS,分钟级别的,而docker 是利用 宿主机的操作系统,省略了这个复杂的过程
Docker的常用命令
帮助命令
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括境像和容器的数量
docker 命令 --help # 帮助命令
帮助文档的地址: https://docs.docker.com/engine/reference/commandline/
镜像命令
docker images 查看所有本地的主机上的镜像
[root@kuangshen /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-wor1d latest bf756fblae65 4 months ago 13.3kB
# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
docker search 搜索镜像
[root@kuangshen /]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysq1 MySQL 9494 [ok]
#可选项,通过搜藏来过滤
--fiter=STARS=3000# 搜索出来的镜像就是STARS大于3000的
[root@kuangshen /]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation..9494 [oK]
mariadb MariaDB is a community-developed fork of MyS..3441 [oK]
[root@kuangshen /]# docker search mysql --filter=STARS=5000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysq1 MySQL is a widely used, open-source relation...9494 [oK]
[root@kuangshen /]#
docker pull 下载镜像
#下载镜像 docker pull 镜像名[:tag]
[root@kuangshen /]# docker pu11 mysql
Using default tag: latest # 如果不写 tag,默认就是 latest
latest: Pulling from library/mysql
5b54d594fba7: Pu11 complete # 分层下载,docker iamge的核心 联合文件系统
07e7d6a8a868: Pu1 complete
abd946892310: Pu11 complete
dd8f4d07efa5: Pu11 complete
076d396a6205: Pu11 complete
cf6b2b93048f: Pu11 complete
530904b4a8b7: Pu71 complete
fble55059a95: Pu11 complete
4bd29a0dcde8: Pu11 complete
b94a001c6ec7: Pu11 complete
cb77cbeb422b: Pu11 complete
2a35cdbd42cc: Pu11 completeDigest: sha256:dc255ca50a42b3589197000b1f9bab2b4e010158d1a9f56c3db6ee145506f625 # 签名
Status : Downloaded newer image for mysgl:latest
docker.io/library/mysql:latest #真实地址
#等价于它
docker pull mysq1
docker pull docker.io/1ibrary/mysql:latest
# 指定版本下载
[root@kuangshen /]# docker pu11 mysql:5.7
5.7: Pulling from library/mysql
5b54d594fba7: ATready exists
07e7d6a8a868: ATready exists
abd946892310: ATready exists
dd8f4d07efa5: ATready exists
076d396a6205: AIready exists
cf6b2b93048f: Already exists
530904b4a8b7: ATready exists
a37958cbebcf: Pu11 complete
04960017f638: Pu1 complete
e1285defod2a: Pu11 complete
670cb3a9678e: Pu11 complete
Digest: sha256:e4d39b85118358ffef6adc5e8c7d00e49d20b25597e6ffdc994696f10e3dc8e2
Status : Downloaded newer image for mysq1:5.7
docker.io/library/mysq1:5.7
docker rmi 删除镜像
[root@kuangshen /]# docker rmi -f 镜像id # 删除指定的镜像
[root@kuangshen /]# docker rmi -f 镜像id 像id 像id 像id # 删除多个镜像
[root@kuangshen /]# docker rmi -f s(docker images -ag) # 删除全部的镜像
容器命令
有了镜像才可以创建容器
docker pull centos
新建容器并启动
docker run [可选参数] image
# 参数说明
--name="Name" 容器名字 tomcat01/tomcat02,用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口-p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口 (常用)
-p 容器端口、随机指定端口
# 测试,启动并进入容器
[root@kuangshen /]# docker run -it centos /bin/bash
[root@e4eccc01b495 /]# 1s # 查看容器内的centos,基础版本,很多命令都是不完善的
bin dev etc home Tib lib64 1ost+found media mnt opt proc root run sbin sry sys tmp usr
var
# 从容器中退回主机
[root@e4eccc01b495 /]# exit
exit
[root@kuangshen /]# ls
bindev home kuangshen lib64 media opt proc boot etc hpt7ib lost+found mnt patch root run sharesys usrww sbin srvtmp var
列出所有的运行的容器
# docker ps 命令
# 列出当前正在运行的容器
-a # 列出当前正在运行的容器+带出历史运行过的容器
-n=? # 显示最近创建的容器
-g # 只显示容器的编号
[root@kuangshen /]# docker ps
CONTAINER ID PORTS IMAGE NAMES COMMAND CREATED STATUS
[root@kuangshen /]#docker ps -a
退出容器
exit # 直接容器停止并退出
Ctr1 + P + Q # 容器不停止退出
删除容器
docker rm 容器id # 删除指定的容器,不能删除正在运行的容器,如果要强制删除rm -f
docker rm -f $(docker ps -aq) # 删除所有的容器
docker ps -a -qlxargs docker rm # 删除所有的容器
启动和停止容器的操作
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前容器
后台启动容器
# 命令 docker run -d 镜像名
[root@kuangshen /]# docker run -d centos
# 问题docker ps,发现 centos 停止了
# 常见的坑:docker 容器使用后台运行,就必须要有要一个前台进程,docker发现没有应用,就会自动停止
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志
docker logs -f -t --tail 容器,没有日志
# 自己编写一段she11脚本
[root@kuangshen /]# docker run -d centos /bin/sh -c "while true;do echo kuangshen;sleep 1;done'
# [root@kuangshen /]# docker ps
CONTAINER ID dce7b86171bf
IMAGE centos
# 显示日志
-tf # 显示日志
--tail number # 要显示日志条数
[root@kuangshen /]# docker logs -tf --tail 10 dce7b86171bf
查看容器中进程信息 ps
# 命令 docker top 容器id
[root@kuangshen /]# docker top dce7b86171bf
查看镜像的元数据
# 命令
docker inspect 容器id
# 测试
[root@kuangshen /]# docker inspect dce7b86171bf
进入当前正在运行的容器
# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
# 命令
docker exec -it 容器id bashshell
# 测试
[root@kuangshen /]# docker ps
[root@kuangshen /]# docker exec -it dce7b86171bf /bin/bash
[root@dce7b86171bf /]# 1s
[root@dce7b86171bf /]# ps -ef
# 方式二
docker attach 容器id
#测试
[root@kuangshen /]# docker attach dce7b86171bf
正在执行当前的代码...
# docker exec # 进入容器后开启一个新的终端,可以在里面操作《常用)
# docker attach # 进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径目的的主机路径
# 查看当前主机目录下
[root@kuangshen home]# Is
idea kuangshen kuangshen .java mysql
[root@kuangshen home]# docker ps
# 进入docker容器内部
[root@kuangshen home]# docker attach b78453025116
[root@b78453025116 /]# cd /home
[root@b78453025116 home]#
# 在容器内新建一个文件
[root@b78453025116 home]# touch test.java
[root@b78453025116 home]# exit
exit
[root@kuangshen home]# docker ps
CONTAINER ID
PORTS
IMAGE
NAMES
[root@kuangshen home]# docker ps -a
# 将这文件拷贝出来到主机上
[rootkuangshen home]# docker cp b78453025116:/home/test.java /home
[root@kuangshen home]# ls
idea kuangshen kuangshen.java mysql test.java
[rootakuanashen home]#
仓库、镜像、容器的关系
镜像相当于Java的类模版,对象,容器是new出来的一个实例对象
docker run
使用 Docker 高效搭建本地开发环境
安装Docker
在mac平台下,就是去下载一个dmg的安装文件。下载好了之后,双击,然后拖入就可以了,windows应该也是类似的。
就是安装qq一样简单,傻瓜式的。
附上dockerhub上的下载链接:https://hub.docker.com/search/?type=edition&offering=community&q=
成功之后属于docker version如果出来版本信息就是安装成功,类似如下
Client: Docker Engine - Community
Version: 18.09.0
API version: 1.39
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:47:43 2018
OS/Arch: darwin/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.0
API version: 1.39 (minimum version 1.12)
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:55:00 2018
OS/Arch: linux/amd64
Experimental: true
安装docker-composer
一般来说,mac安装docker之后就会携带docker-composer。
其他平台,附上下载链接:https://github.com/docker/compose/releases
安装完成之后可以输入命令检测
➜ ~ docker-compose version
docker-compose version 1.23.2, build 1110ad01
docker-py version: 3.6.0
CPython version: 3.6.6
OpenSSL version: OpenSSL 1.1.0h 27 Mar 2018
下载laradock
laradock的项目地址是https://github.com/laradock/laradock 我们找一个地方clone下来即可
我这里是在我的用户目录下面新建了一个Docker目录,然后clone了项目下来
配置env文件
1. 拷贝example成.env
cp env-example env
2. .env文件中APP_CODE_PATH_HOST是本地路径 APP_CODE_PATH_CONTAINER是远程映射路径,看需求修改,大多数情况下是不需要的
3. 如果有调试代码的需求,也可以将PHP_FPM_INSTALL_XDEBUG和WORKSPACE_INSTALL_XDEBUG两个选项打开
4. 如果还有其他的需求,可以在.env里面搜索,里面已经将大多数配置项都给独立出来了
运行容器
进入到laradock的工作目录下面,就是clone的项目的根目录我的工作目录就是~/Docker/laradock。
然后运行如下命令
docker-compose up -d nginx mysql
就会看到在自动执行build操作,并且build完了之后自动后台启动了如下容器
* nginx
* php-fpm
* workspace
* mysql
那是因为php-fpm和workspace还有docker-in-docker是随nginx一并启动的
所以实际上
docker-compose up -d nginx mysql
和
docker-compose up -d nginx workspace php-fpm mysql
这两条命令的效果是一样的,可以都带上,也可以不写。
up命令在第一次启动的时候实际上就是build + start的组合,如果容器不存在,那么就build一个容器,并且启动服务,如果容器存在那么直接启动服务,大概就是这么个意思 -d的意思是后台运行
配置web项目
一下是我laravel项目的部分配置
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=blog
DB_USERNAME=root
DB_PASSWORD=root
......
注意,数据库主机必须得是别名才可以,如果DB_CONNECTION这个地方输入172.0.0.1或者是localhost都是会连接失败的。
在其它的项目中也必须是这样的,配置数据库链接,redis,或者MemCache链接都必须设置成具体的别名。或者你说我找到各个容器的ip,可以嘛。可以,但是并不建议这样做,因为ip是会变动的。
具体别名可以参考./docker-compose.yml文件中的设置
这个主要的技术实现应该是用了docker的虚拟网桥技术.
配置宿主机的host
因为,往往我们访问的时候,是通过宿主机上面的浏览器发送请求的,所以,配置宿主机上面的host必不可少。
vim /etc/hosts
我这里加入一条我自己设置的虚拟域名
127.0.0.1 blog.test
然后保存,刷新下host。
配置nginx
进入到./laradock/nginx/sites文件夹,然后ll一下,我们会发现,laradock已经帮我们放了好多列举的文件进来
app.conf.example default.conf laravel.conf.example symfony.conf.example
根据需求拷贝一份,然后修改一下就可以了,都不是很难,由于我们本地是laravel开发的博客项目,所以我就直接拷贝laravel.conf.example,然后使用vim打开
cp laravel.conf.example blog.conf vim blog.conf
打开后的内容...
server {
listen 80;
listen [::]:80;
# For https
# listen 443 ssl;
# listen [::]:443 ssl ipv6only=on;
# ssl_certificate /etc/nginx/ssl/default.crt;
# ssl_certificate_key /etc/nginx/ssl/default.key;
server_name laravel.test;
root /var/www/laravel/public;
index index.php index.html index.htm;
location / {
try_files
$uri
$uri
/ /index.php
$is_args
$args
;
}
location ~ \.php$ {
try_files
$uri
/index.php =404;
fastcgi_pass php-upstream;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME
$document_root
$fastcgi_script_name
;
#fixes timeouts
fastcgi_read_timeout 600;
include fastcgi_params;
我们会发现,如果没有特殊需求的话,这个里面大多数地方我们并不需要修改。我们只需要关注server_name和root这两个参数,把这个里面的laravel换成我们项目名就可以了,这里我们换成blog
下面是修改后的内容
server {
listen 80;
listen [::]:80;
# For https
# listen 443 ssl;
# listen [::]:443 ssl ipv6only=on;
# ssl_certificate /etc/nginx/ssl/default.crt;
# ssl_certificate_key /etc/nginx/ssl/default.key;
server_name blog.test;
root /var/www/blog/public;
index index.php index.html index.htm;
location / {
try_files
$uri
$uri
/ /index.php
$is_args
$args
;
}
location ~ \.php$ {
try_files
$uri
/index.php =404;
fastcgi_pass php-upstream;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME
$document_root
$fastcgi_script_name
;
#fixes timeouts
fastcgi_read_timeout 600;
include fastcgi_params;
访问——输入url:http://blog.test/
Linux上安装Docker
Docker的三大核心概念:镜像、容器、仓库
镜像:类似虚拟机的镜像、用俗话说就是安装文件。
容器:类似一个轻量级的沙箱,容器是从镜像创建应用运行实例,可以将其启动、开始、停止、删除、而这些容器都是相互隔离、互不可见的。
仓库:类似代码仓库,是Docker集中存放镜像文件的场所。
在CentOS上安装Docker:
前置条件:
- 64-bit 系统
- kernel 3.10+
1.检查内核版本,返回的值大于3.10即可
$ uname -r
2.使用 sudo 或 root 权限的用户登入终端。
3.确保yum是最新的:
$ yum update
4.添加 yum 仓库
tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
5.安装 Docker
$ yum install -y docker-engine
安装成功后,使用docker version命令查看是否安装成功,安装成功后------如下图
6.启动docker
$systemctl start docker.service
7.验证安装是否成功(有client和service两部分表示docker安装启动都成功了),使用docker version命令查看
8.设置开机自启动
$ sudo systemctl enable docker