【后端学习】Docker

Docker概述

发布项目=jar+(Redis+MySQL+jdk+ES),需要配置对应环境

Docker解决(集装箱思想):

  1. java–>apk–>发布(应用商店)–> 张三使用apk–>安装即可用
  2. java–>jar (环境)–>打包项目带上环境(镜像 )–>( Docker仓库:商店 )–>下载发布的镜像–>直接运行

Docker核心思想:打包装箱,且每个箱子是互相隔离的。

Docker 是基于 Go 语言开发的开源项目

官网 : https://www.docker.com/

文档地址 : https://docs.docker.com/

仓库地址 : https://hub.docker.com/

虚拟化技术:

  1. 虚拟机:在window中装一个Vmware,通过这个软件可以虚拟出来一台或者多台电脑,稍显笨重
  2. 资源占用十分多
  3. 冗余步骤多
  4. 启动很慢
  5. Docker容器技术:不是模拟的一个完整的操作系统

Docker 和 虚拟机技术的不同:

  1. 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
  2. 容器内的应用直接运行在 宿主机的内容,容器是没有自己的内核的,也没有虚拟硬件,所以就轻便了。每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响。

DevOps (开发、运维)

  1. 应用更快速的交付和部署
  2. 传统:一堆帮助文档,安装程序
  3. Docker : 打包镜像发布测试,一键运行
  4. 更便捷的升级和扩缩容:使用了Docker之后,部署应用就和搭积木一样。项目打包为一个镜像,扩展 服务器A、服务器B
  5. 更简单的系统运维:在容器化之后,开发,测试环境都是高度一致的。
  6. 更高效的计算资源利用:Docker 是 内核级别的虚拟化,可以在一个物理机上可以运行很多的容器实例。服务器的性能可以被压榨到极致。

Docker的基本组成

Image.png

  1. 镜像(image ) :docker镜像好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===> run ==> tomcat01 容器(提供服务器),通过这个镜像可以创建多个容器( 最终服务运行或者项目运行就是在容器中的 )。
  2. 容器( container) :Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。启动,停止,删除,基本命令。目前把容器理解为一个简易的linux系统
  3. 仓库(repository) :存放镜像的地方。分为公有仓库和私有仓库。Docker Hub( 默认是国外的),阿里云有容器服务器(用于配置镜像加速)

Docker的安装

  1. 环境准备:Linux+CentOs 7+Xshell
  2. 环境查看
# 系统内核是 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的默认工作路径

阿里云镜像加速:

  1. 登录阿里云找到容器服务
  2. 找到镜像加速地址
  3. 配置使用
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

Image.png

Docker工作的底层原理

Docker 是一个 Client- Server 结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问。DockerServer 接收到 Docker-Client 的指令,就会执行这个命令

Image.png

Docker 为什么比 VM 快?

1、Docker有着比虚拟机更少的抽象层

2、docker 利用的是宿主机的内核,vm 需要是 Guest OS

Image.png

新建一个容器的时候docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载 Guest OS,分钟级别的,而docker 是利用 宿主机的操作系统,省略了这个复杂的过程

Image.png

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]#

Image.png

仓库、镜像、容器的关系

官网:https://www.docker.com/

仓库:https://hub.docker.com/

镜像相当于Java的类模版,对象,容器是new出来的一个实例对象

Image.png

docker run

Image.png

使用 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_XDEBUGWORKSPACE_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:

前置条件:

  1. 64-bit 系统
  2. 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
  • 24
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值