Docker学习总结

docker其实就是帮助我们在linux上安装各种软件的小帮手。我是这么认为的哈,他里面引入了两个概念,镜像和容器,镜像就是我们所要安装的软件,只不过是docker所需要的格式,容器就是镜像运行的地方。相当于一个小型linux系统。


Docker初识

- Docker是一个开源的应用容器引擎,官网:https://www.docker.com
- 诞生于2013年初,基于Go语言实现, dotCloud公司出品(后改名为Docker Inc)
- Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。
- 容器是完全使用沙箱机制,相互隔离。

 

* 仓库(Repository):
    - 仓库是集中存放镜像文件的场所。
    - 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
    
* 镜像(Image)
    - 就是一个只读模板,比如:一个镜像可以包含一个完整的CentOS,里面仅安装jdk或用户的其他应用。
    - 镜像可以用来创建docker容器。

* 容器(Container):
    - 镜像和容器的关系,就像是Java中的类和对象一样。
    - 容器是从镜像创建的运行实例,它可以被启动、停止、 删除。
    - 每个容器都是相互隔离的、保证安全的平台。
    - 可以把容器看做是一个简易版的Linux 环境(包括root用户权限、进程空间、用户空间)和运行在其中的应用程序。

 


基于CentOS 7安装Docker:

# 1、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 
yum install -y yum-utils device-mapper-persistent-data lvm2

# 2、设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 3、安装docker,出现输入的界面都按 y 
yum install -y docker-ce

# 4、查看docker版本,验证是否验证成功
docker -v

# 5、启动docker环境
systemctl start docker

# 6、设置开机自启动
systemctl enable docker

配置镜像加速器

默认情况下,将来从docker hub(Docker Hub)上下载docker镜像,太慢。一般都会配置镜像加速器:

创建或修改 /etc/docker/daemon.json文件,修改为如下形式:

# 中国科技大学镜像地址
{
 "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}

# 网易云镜像地址
{
 "registry-mirrors":["http://hub-mirror.c.163.com"]
}

# 阿里云镜像,需要自己手动生成的加速地址:https://cr.console.aliyun.com/
# 重启docker
systemctl restart docker

# 查看是否成功
docker info

Docker常用命令(重点)

进程相关命令

# 启动服务
systemctl start docker 

# 停止服务 
systemctl stop docker

# 重启服务	
systemctl restart docker

# 查看服务的状态	
systemctl status docker 

# 设置开机自启动 
systemctl enable docker

镜像相关命令

# 查看本地镜像 
docker images

# 搜索镜像仓库,推荐:https://hub.docker.com/
docker search 镜像名称 

# 下载(拉取)镜像,镜像名称格式为 名称:版本号
docker pull 镜像名称

# 删除镜像(慎重)
docker rmi 镜像名称

容器相关命令

# 查看本地容器
docker ps 	  # 能查看正在运行
docker ps -a  # 能查看所有的容器(运行的和停止的)

# 创建一个新的容器并运行(-d  后台运行容器,并返回容器ID  -p 主机端口:容器端口  指定映射关系)
docker run -d -p 80:80 --name=容器名 镜像名称

# 进入容器内部
docker exec -it 容器名称 /bin/bash

# 查看容器信息
docker inspect 容器名称

# 启动容器
docker start 容器名称

# 停止容器
docker stop 容器名称

# 删除容器
docker rm 容器名称

 

如果服务器提示你

说明你的linux服务关闭了请求转发功能, docker容器访问一般是需要做转发的,怎么开启呢?

修改文件vim /usr/lib/sysctl.d/00-system.conf,在最后追加一行net.ipv4.ip_forward=1

改完之后需要重启网络服务systemctl restart network

 


Docker部署程序

部署MySQL

# 搜索mysql镜像
docker search mysql

# 拉取mysql镜像
docker pull mysql:5.7

# 创建并启动容器
docker run -d -p 3306:3306 --name=mysql5.7 -e MYSQL_ROOT_PASSWORD=root mysql:5.7 \
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

部署Tomcat

# 搜索tomcat镜像
docker search tomcat

# 拉取tomcat镜像
docker pull tomcat:8.5

# 创建并启动容器
docker run -d --name=tomcat8.5 -p 8080:8080 tomcat:8.5

# 在本地模拟一个项目(创建一个hello目录,然后向目录中输出一个文件index.html,内容为hello world)
mkdir ./hello
echo "hello world" > ./hello/index.html

# 从宿主机复制文件到容器(docker cp 宿主机路径 容器名称:容器路径)
docker cp ./hello tomcat8.5:/usr/local/tomcat/webapps/

部署Redis

# 搜索redis镜像
docker search redis

# 拉取redis镜像
docker pull redis:5.0

# 创建并启动容器
docker run -d --name=redis5.0 -p 6379:6379 redis:5.0

 

部署Nginx

# 搜索nginx镜像
docker search nginx

# 拉取tomcat镜像
docker pull nginx

# 创建并启动容器
docker run -d --name=nginx -p 80:80 nginx

DockerCompose

Compose介绍

* 在以后的开发中,可能存在同一环境中出现多个程序的情况,这些程序都会单独的作为容器启动,比如说:
    container-order  订单程序
    container-user   用户程序
    container-redis  redis
    container-mysql  mysql
* 这些容器需要同时启动,同时停止,如果我们一个个的去操作,就会变的很麻烦,这时候我们就需要一个批量操作容器的工具


* Compose是Docker的服务编排工具,主要用来构建基于Docker的复杂应用
* Compose通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景

 

Compose安装

# 安装docekr compose 工具
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# 设置权限
chmod +x /usr/local/bin/docker-compose

# 查看版本 
docker-compose -version

Compose案例

通过docker compose进行容器批量管理:一次性启动三个容器(nginx,tomcat,redis)

1) 创建docker-compose目录

mkdir ~/docker-compose
cd ~/docker-compose

2) 创建docker-compose.yml文件,内容如下

version: '3'
services: 
  nginx:
   container_name: my_nginx
   image: nginx
   ports:
    - 80:80
  tomcat:
   container_name: my_tomcat
   image: tomcat:8.5
   ports:
    - 8080:8080    
  redis:
   container_name: my_redis
   image: redis:5.0
   ports:
    - 6379:6379        

3) 启动容器

# 为了演示效果更佳明显,我们使用下面命令先停止并删除所有容器
docker stop $(docker ps -q)
docker rm $(docker ps -aq)

# 执行命令,启动容器
# 执行此命令的时候,需要和配置文件在同一个目录下
docker-compose up -d

4) 停止并删除容器  

# 执行此命令的时候,需要和配置文件在同一个目录下
docker-compose down


 

Docker数据卷(重点)

数据卷概念

思考这样两问题:

  • Docker容器删除后,容器中的数据会不会永久丢失,如果是,岂不是很危险?

  • 容器之间可不可以实现文件的共享呢?

数据卷:

  • 数据卷是宿主机中的一个目录或文件,它可以被挂载到容器中,在容器中对它的操作可以直接反应到宿主机上

  • 一个容器可以被挂载多个数据卷,一个数据卷也可以被多个容器同时挂载

 

 

配置数据卷

 

# 在/root目录下创建tomcat目录用于存储tomcat数据信息
mkdir -p /root/tomcat/webapps

# 创建容器,设置端口映射、目录映射
# docker run ... –v 宿主机目录(文件):容器内目录(文件) ...
docker run -d --name=tomcat1 -p 8081:8080 -v /root/tomcat/webapps:/usr/local/tomcat/webapps tomcat:8.5
docker run -d --name=tomcat2 -p 8082:8080 -v /root/tomcat/webapps:/usr/local/tomcat/webapps tomcat:8.5

Docker镜像制作

镜像构成

Docker镜像是一个分层文件系统,最底端是bootfs,它会直接使用宿主机的bootfs;第二层是root文件系统rootfs,称为base image

然后再往上可以叠加其他的镜像文件,一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。

 

 

使用容器制作镜像

docker允许将一个容器直接转化为镜像,使用的命令如下:

docker commit 容器id 镜像名称:版本号

 案例:修改当前的nginx容器中的index.html文件内容为hehe,然后将修改后的容器做成一个名为mynginx:hehe的镜像

#1. 查看当前正在运行的容器
[root@itcast ~]# docker ps
CONTAINER ID        IMAGE        COMMAND                 CREATED             STATUS              PORTS                     NAMES
0ce0bf14399d        nginx       "/docker-entrypoint.…"   14 hours ago        Up 14 hours         0.0.0.0:80->80/tcp        nginx

#2. 进入nginx容器,然后向主页面覆盖写入"hehe",然后退出容器
[root@itcast ~]# docker exec -it nginx /bin/bash
root@0ce0bf14399d:/# echo "hehe" > /usr/share/nginx/html/index.html
root@0ce0bf14399d:/# exit

#3. 将修改之后的容器生成为mynginx:hehe镜像
[root@itcast ~]# docker commit nginx mynginx:hehe
sha256:139a9ea6a6008bc5557566e54316ccd8b93f508dba1daf7296235a461c8d471e

#4. 查看镜像
[root@itcast ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mynginx             hehe                139a9ea6a600        8 seconds ago       133MB

 

 

使用Dockerfile制作镜像

Dockerfile是一个用于描述生产docker镜像的文件,它里面是一条条的指令,每条指令都会对镜像产生一定影响。

 

案例:基于jdk1.8环境运行springboot项目,打包为镜像  

 1) 将springboot-hello-0.0.1-SNAPSHOT.jar上传到linux

 2)创建一个springboot-dockerfile文件,内容如下

 

# 定义基础镜像(从哪个镜像的基础上开始做)
FROM java:8 
# 定义作者信息(可以省略)
MAINTAINER  itheima <itheima@itcast.cn>
# 将jar包添加到容器,并改名为app.jar
ADD springboot-hello-0.0.1-SNAPSHOT.jar app.jar
# 镜像启动容器的时候,执行的命令
CMD java -jar app.jar

3) 通过dockerfile构建镜像

# -f :指定要使用的Dockerfile路径   -t :指定生成的镜像名称   .  镜像构建过程中的上下文环境的目录 	
docker build -f ./springboot-dockerfile -t app-itheima .

4) 查看生成的镜像,并运行为容器

[root@itcast ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
app-itheima         latest              663f3e3e33fb        35 minutes ago      661MB

[root@itcast ~]# docker run -d -p 18080:8080 app-itheima:latest
5ea166a3dbec4c091d7a70f84b75703f55a9ccd93f3a45466e4eeb9ac56fdb17

[root@itcast ~]#
[root@itcast ~]# docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED            PORTS                         NAMES
5ea166a3dbec        app-itheima:latest   "/bin/sh -c 'java -j…"   7 seconds ago      0.0.0.0:18080->8080/tcp       serene_antonelli

5)访问测试  

镜像导入导出(扩展)

需求:将mynginx:hehe镜像共享给其他人,或者是将别人共享给的镜像包导入到系统中

# 将镜像保存成tar包: docker save -o 包名 镜像:版本
[root@itcast ~]# docker save -o mynginx.tar mynginx:hehe
[root@itcast ~]# ls
mynginx.tar

# 接下来删除我们本地的mynginx:hehe镜像
[root@itcast ~]# docker rmi mynginx:hehe
Untagged: mynginx:hehe
Deleted: sha256:0121bd7115b67719cc215cea3c2a2b090c0a42a1d70cbd46d4d243fa9c8b0edd

# 然后再从tar包中将镜像导入到本机
[root@itcast ~]# docker load -i  mynginx.tar
Loaded image: mynginx:hehe

Docker和VM对比【了解】

 

相同:

  • 容器和虚拟机具有相似的资源隔离和分配优势

不同:

  • 容器虚拟化的是操作系统,虚拟机虚拟化的是硬件。

  • 传统虚拟机可以运行不同的操作系统,容器只能运行同一类型操作系统

特性容器虚拟机
启动秒级分钟级
硬盘使用一般为MB一般为GB
CPU/内存消耗
系统支持量单机支持上百个容器一般十几个

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值