Docker的初步了解

Docker概述

Docker文档地址

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

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

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

Docker安装

Docker的基本组成

点击查看源网页

镜像(image):

docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像=>run=>tomcat01容器(提供服务器)

容器(container):

Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建。

启动、停止、删除等基本命令

可以把容器理解成一个简易的linux系统

仓库(repository):

存放镜像的位置

仓库分为公有仓库和私有仓库

安装Docker

环境准备
环境检查
# 系统内核
[root@master ~]# uname -r
3.10.0-862.el7.x86_64

# 系统信息
[root@master ~]# 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="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
安装准备
# 1.卸载老版本
sudo yum remove docker \
                docker-client \
                docker-client-latest \
                docker-common \
                docker-latest \
                docker-latest-logrotate \
                docker-logrotate \
                docker-engine
                
# 2.需要的安装包
sudo yum install -y yum-utils

# 3.设置镜像仓库
#删除异常源
sudo rm -f /etc/yum.repos.d/docker-ce.repo
# 使用官方源
sudo yum-config-manager \
     --add-repo \
     https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的
     
# 推荐使用阿里云
sudo yum-config-manager \
		 --add-repo \
		 http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 4.更新yum软件包索引
sudo yum makecache fast

# 5.安装docker相关的 docker-ce社区 
sudo yum install docker-ce docker-ce-cli containerd.io

# 6.启动docker
systemctl start docker

docker version # docker 判断是否安装成功

# 7.测试docker
docker run hello-world

# 8.查看刚才下载的 hello-world 镜像
docker images

了解:卸载docker

# 1.卸载依赖
yum remove docker-ce docker-ce-cli containerd.io

# 2.删除资源
rm -rf /var/lib/docker  # docker的默认工作路径

开始->Docker会在本机寻找镜像->到Docker Hub上下载

底层原理

Docker是怎么工作的?

Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问

DockerServer接收到Docker-Client的指令,就会执行这命令

Docker为什么比VM快?

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

2.Docker利用的是宿主机的内核,VM需要Guest OS

Docker的常用命令

帮助命令

docker version     # 显示docker的版本信息
docker info        # 显示docker的系统信息,包括镜像和容器
docker 命令 --help  

帮助文档的地址:https://docs.docker.com/reference/

镜像命令

docker images 查看所有本地的主机上的镜像

[root@master ~]# docker images -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        5 months ago       13.3kB

# 解释
REPOSITORY 镜像的仓库源
TAG        镜像的标签
IMAGE ID   镜像的ID
CREATED    镜像的创建时间
SIZE       镜像的大小

Options:
  -a, --all             Show all images (default hides intermediate images)
      --digests         Show digests
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print images using a Go template
      --no-trunc        Don't truncate output
  -q, --quiet           Only show numeric IDs

docker search 搜索镜像

[root@master ~]# docker search mysql
官网: https://hub.docker.com

# 过滤搜索 STARS 大于 3000
docker search mysql --filter=STARS=3000

docker pull 下载镜像

[root@master ~]# docker pull mysql
Using default tag: latest # 如果不写 tag, 默认就是 latest
latest: Pulling from library/mysql
afb6ec6fdc1c: Pull complete # 分层下载,docker image的核心 联合文件系统
0bdc5971ba40: Pull complete
97ae94a2c729: Pull complete
f777521d340e: Pull complete
1393ff7fc871: Pull complete
a499b89994d9: Pull complete
7ebe8eefbafe: Pull complete
597069368ef1: Pull complete
ce39a5501878: Pull complete
7d545bca14bf: Pull complete
211e5bb2ae7b: Pull complete
5914e537c077: Pull complete
Digest: sha256:a31a277d8d39450220c722c1302a345c84206e7fd4cdb619e7face046e89031d
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest


[root@master ~]# docker pull mysql:5.7 # 指定tag版本下载
5.7: Pulling from library/mysql
afb6ec6fdc1c: Already exists  # 已经存在的文件就不用再次下载,联合文件系统
0bdc5971ba40: Already exists
97ae94a2c729: Already exists
f777521d340e: Already exists
1393ff7fc871: Already exists
a499b89994d9: Already exists
7ebe8eefbafe: Already exists
4eec965ae405: Pull complete
a531a782d709: Pull complete
270aeddb45e3: Pull complete
b25569b61008: Pull complete
Digest: sha256:d16d9ef7a4ecb29efcd1ba46d5a82bda3c28bd18c0f1e3b86ba54816211e1ac4
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MIyVmXxK-1591324844048)(/Users/elaiza/Library/Application Support/typora-user-images/image-20200603212242306.png)]

docker rmi -f IMAGE ID 删除镜像

[root@master ~]# docker rmi -f a4fdfd462add          # 根据镜像ID去删除
[root@master ~]# docker rmi -f $(docker images -aq)  # 递归删除全部镜像

容器命令

说明:我们有了镜像才可以创建容器,linux, 下载一个centos镜像来测试学习

docker pull centos

新建容器并启动

docker run [可选参数] image

# 参数说明
--name="Name" 容器名字
-d            后台方式运行
-it           使用交互方式运行,进入容器查看内容
-P            指定容器的端口 -P   8080:8080
-p            随机指定端口

# 进入centos容器
[root@master ~]# docker run -it centos /bin/bash 
[root@9393dd5e2d90 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

# 退出容器
[root@9393dd5e2d90 /]# exit

列出正在运行的容器

docker ps 命令
		  # 列出当前正在运行的容器
-a	  # 列出当前正在运行的容器+历史运行过的容器
-n=?  # 显示最近创建的容器
-q    # 只显示容器ID

docker ps -aq

退出容器

exit          # 容器停止加退出
ctrl + P + Q  # 容器不停止退出

删除容器

docker rm 容器ID                  # 删除指定容器(但是不能删除正在运行的容器)
docker rm -f $(docker ps -aq)    # 递归删除所有容器
docker ps -a -q|xargs docker rm  # 递归删除所有容器

启动和停止容器的操作

docker start   容器ID   # 启动容器
docker restart 容器ID   # 重启容器
docker stop    容器ID   # 停止当前运行的容器
docker kill    容器ID   # 杀掉容器

常用的其他命令

后台启动容器

# 命令 docker run -d 镜像名
[root@master ~]# docker run -d centos
2c1e708856b7ed6d93804252a72699c9c3b5afa5d47192eb0eb44e8f652a2c70

# 问题docker ps, centos 停止了

# 原因:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止

查看日志命令

# 开启
docker run -d centos /bin/sh -c "while true;do echo hello docker;sleep 2; done"

docker logs -ft 容器ID            # 查看全部日志
docker logs -ft --tail 10 容器ID  # 查看10条日志

查看容器中进程信息 ps

docker top 容器ID(正在运行)

[root@master ~]# docker top 96c7945dd950       

查看镜像、容器元数据信息

docker inspect 容器ID
docker inspect 镜像名称

进入当前正在运行的容器

# 方式一: 进入容器后开启一个新的终端,可以在里面操作(常用)
docker exec -it 
[root@master ~]# docker exec -it ed0bdaa79f35 /bin/bash

# 方式二: 进入容器正在执行的终端,不会启动新的进程
docker attach 容器ID 
[root@master ~]# docker attach ed0bdaa79f35

从容器拷贝文件到主机上

docker cp 容器ID:目录 主机目录
[root@master ~]# docker cp f8dc02ea420e:/home/dockerDemo.java ./

小结

https://www.runoob.com/docker/docker-command-manual.html

练习

# 安装nginx
docker pull nginx

# 开启nginx
# nginx 的80端口映射到主机的3344端口
docker run -d --name nginx01 -p 3344:80 nginx

# 进入nginx容器,交互模式
docker exec -it nginx01 /bin/bash
# 官方推荐使用tomcat
docker run -it --rm tomcat:9.0
# 停止容器后,就删除,一般用于测试

# 安装tomcat镜像
docker pull tomcat

# 开启tomcat
# tomcat 的8080端口映射到主机的3344端口
docker run -d --name tomcat01 -p 3345:8080 tomcat

# 进入nginx容器,交互模式
docker exec -it tomcat01 /bin/bash

# 但是tomcat容器是阉割版的
# 将容器里的 webapps.dist/* 拷贝到 webapps就可以了
root@5dce35fc69b9:/usr/local/tomcat# cp -r webapps.dist/* webapps
# 安装mysql 考虑数据持久化的问题

# 安装mysql5.7镜像
docker pull mysql:5.7

# 运行容器,需要做数据挂载,配置密码
docker run -d -p 3307:3306 -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=hadoop --name mysql01 mysql:5.7

mysql -hmaster -uroot -P3307 -p

# 解释命令
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 命名容器名字

可视化

Portainer

docker run -d -p 3346:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock \
--privileged=true portainer/portainer

Commit

# 1. 启动一个默认的tomcat

# 2. 发现这个默认的tomcat没有webapps应用,镜像的原因,官方默认没有

# 3. 自己拷贝文件

# 4. 将我操作过的镜像commit提交为一个镜像,我们以后就可以使用修改过的镜像

# 5. docker commit -a="elaiza" -m="add webapps app" 镜像ID tomcat02:1.0

容器数据卷

如果数据都在容器中,那么我们删除容器,数据就会被丢失

docker run -it -v /root/dockerhome:/home centos /bin/bash

具名和匿名挂载

# 匿名挂载: -P 随机端口 -v 容器内路径 
docker run -d -P --name nginx01 -v /etc/nginx nginx

# 查看所有的 volume 的情况
docker volume ls

# 具名挂载(名字) -v 卷名:容器内路径
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

# 查看具名挂载到的主机路径
docker volume inspect juming-nginx

[
    {
        "CreatedAt": "2020-06-04T00:08:14+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/9afbf1895cf34b6faab0c9283ed03e49262b7a93e06a78e3d7ef6852276042c4/_data",
        "Name": "9afbf1895cf34b6faab0c9283ed03e49262b7a93e06a78e3d7ef6852276042c4",
        "Options": null,
        "Scope": "local"
    }
]

扩展:

推荐是使用具名挂载
# 如何确定具名挂载还是匿名挂载还是指定路径挂载
-v 容器内路径           # 匿名挂载
-v 卷名:容器内路径      # 具名挂载
-v /主机路径:容器内路径  # 指定路径挂载


# 通过 -v 容器内路径, ro rw 读写权限
ro readonly  # 只读
rw readwrite # 可读可写

# 一但这个设置了容器权限,容器对我们挂载出来的内容就有限定
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部无法操作

DockerFile

什么是dockerFile

就是用来构建docker镜像的构建文件

通过脚本可以生成镜像,镜像是一层一层的,脚本一个一个的命令,每个命令都是一层

构建步骤

1.编写一个dockerfile文件

2.docker build 构建一个镜像

3.docker run 运行镜像

4.docker push 发布镜像(DockerHub)

# 一、创建dockerfile文件
cd /root/docker-test-volume
vim dockerFile01

# 第一层
FROM centos
# 第二层:匿名挂载,开启容器的时候会在容器内自动生成,对应的主机也会挂载
VOLUME ["volume01","volume02"]
# 第三层
CMD echo "---end---"
# 第四层
CMD /bin/bash

# 二、创建镜像
docker build -f ./dockerFile01 -t elaiza/centos:1.0 .

# 三、启动容器进入容器,可以发现匿名挂载的目录
docker run -it 0003ac258a85 /bin/bash

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ceRv8TUI-1591324844049)(/Users/elaiza/Library/Application Support/typora-user-images/image-20200604112556375.png)]

# 四、查看主机上的挂载目录信息
docker inspect 0003ac258a85

DockerFile的指令

FROM        # 基础镜像,一切从这里开始构建
MAINTAINER  # 镜像是谁写的,姓名+邮箱
RUN         # 镜像构建的时候需要运行的命令
ADD         # 压缩包,添加内容
WORKDIR     # 镜像的工作目录
VOLUME      # 挂载的目录
EXPOSE      # 暴露端口
CMD         # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,不能追加执行
ENTRYPOINT  # 指定这个容器启动的时候要运行的命令,可以追加命令执行
ONBUILD     # 当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的指令,触发命令
COPY        # 类似ADD,将文件拷贝到镜像中
ENV         # 构建的时候设置环境变量! 如mysql的密码设置

实操

Centos

# 创建增强版的centos
# 1. 编写DockerFile文件
FROM centos
MAINTAINER elaiza<122323@qq.com>
ENV MYPATH /uer/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash

# 2. 构建镜像
docker build -f dockerfile文件路径 -t 镜像名:[tag] .

docker build -f dockerfile-centos -t elaizacentos:1.0 .

# 3. 进入容器[tag]
docker run -it elaizacentos:1.0

# 4. 通过 docker history 镜像ID 查看安装过程
docker history 7b461ae0ac71

tomcat

# 1. 准备 tomcat 和 jdk 的压缩包

# 2. 创建DockerFile

# 3. 编写DockerFile
FROM centos
MAINTAINER elaiza<122323@qq.com>
COPY readme.txt /usr/local/readme.txt

ADD jdk-8u45-linux-x64.gz /usr/local/
ADD apache-tomcat-9.0.35.tar /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_45
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.35
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.35/logs/catalina.out

# 构建镜像(最好打标签tag)
docker build -t elaizatomcat:1.0 .

# 开启容器(后台运行tomcat,挂载apps目录和日志目录)
docker run -d -p 9090:8080 --name elaizatomcat01 -v /root/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test -v /root/tomcat/logs:/usr/local/apache-tomcat-9.0.35/logs elaizatomcat

# 进入
docker exec -it 0b7d93c5fe32 /bin/bash


发布镜像

# 1. 登录
docker login -u elaiza 密码:elaiza112233

# 2. push镜像到服务器(要对镜像打标签)且在 elaiza目录下
docker tag e955e82245d3 elaiza/elaizatomcat:1.0
docker push elaiza/elaizatomcat:1.0

容器间的数据共享

数据卷容器

docker run -it --name docker01 centos

docker run -it --name docker02 --volumes-from docker01 centos

发布SprintBoot项目

# 建立Dockerfile文件

FROM java:8

COPY *.jar /app.jar

CMD ["--server.port=8080"]

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "/app.jar"]


# 将jar包和Dockerfile放到同一目录,构建镜像
docker build -t sp8080 .

# 开始容器
docker run -d -P --name sp8080-web sp8080
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值