Docker

Docker

Docker的名词解释

image-20220416183659781

镜像(image):
  • Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像 ===> run ===> tomcat01容器, 通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的);
容器(container)
  • Docker利用容器技术,独立运行一个或者一组应用, 通过镜像来创建的;
  • 启动,停止,删除,基本命令!
仓库(repository)
  • 存放镜像的地方;
  • Docker Hub(默认是国外的);
  • 阿里云都有容器服务(配置镜像加速!);

安装Docker

https://docs.docker.com/engine/install/centos/

环境准备

1:需要会一点Linux命令

2:Centos 7

3:使用Xshell 远程连接服务器进行操作

环境查看
[root@VM-4-6-centos ~]# uname -r 
3.10.0-1160.49.1.el7.x86_64 

1.卸载旧版本docker

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2.需要的安装包

yum install -y yum-utils

3.设置镜像的仓库(推荐使用阿里云)

yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新yun软件包索引

yum makecache fast

4.安装docker docker-ce社区 ee企业版

yum install docker-ce docker-ce-cli containerd.io

5.启动docker

systemctl start docker

6.使用docker version判断是否安装成功

docker run hello-world

此命令下载测试映像并在容器中运行它。当容器运行时,它会打印一条消息并退出。

7.查看一下下载的docker镜像

卸载docker

1.卸载依赖

yum remove docker-ce docker-ce-cli containerd.io

2.删除资源

rm -rf /var/lib/docker

Docker镜像加速

这里以腾讯云为例(宝塔面板傻瓜式安装)

image-20220417164505790

Docker常用命令

docker version #显示docker

docker info #显示docker的系统信息,包括镜像和容器的数量

docker help #帮助命令

镜像命令

docker images 查看所有本地所有镜像

image-20221009191301955

 #解释
Repository 镜像的仓库源
Tag        镜像的标签版本
Image ID   镜像ID
Created    镜像创建时间
Size       镜像大小

docker search mysql搜索镜像

image-20221009191632741

docker pull 下载镜像

docker pull mysql
Using default tag: latest #不写tag,默认会下载最新的tag镜像

#指定5.7版本mysql
docker pull mysql:5.7  #这个版本一定是docker hub上有的版本才可以

docker rmi删除镜像

docker images #查看镜像
docker rmi -f IMAGE ID  #删除指定镜像,rmi表示remove image(删除镜像) -f表示force强制删除
docker rmi -f IMAGE ID IMAGE ID IMAGE ID      #删除多个镜像
docker rmi -f $(docker images -aq)             #删除全部镜像 -aq查出所有镜像id

容器命令

新建容器并启动

image-20221009192941686

image-20220420151313780

#-p第一个为对外暴露端口,第二个为容器内端口
docker run --name mynginx -p 80:80 -d nginx

查看容器

 docker ps      列出当前正在运行的容器
 docker ps -a   列出当前正在运行的容器+未运作的容器

查看容器日志

docker logs 容器id        查看容器日志
docker logs -f 容器id     可持续查看容器日志

删除容器

docker rm 容器id   #删除指定容器,不能删除正在运行的容器,如果要强制删除 rm-f
docker rm -f $(docker ps -aq) #删除所有容器

启动和停止容器的操作

docker start 容器id    #启动容器
docker restart 容器id  #重启容器
docker stop 容器id     #停止当前正在运行的容器
docker stop $(docker ps -aq) #停止当前运行所有容器
docker kill 容器id     #强制停止当前容器

进入容器

#方式一,以下是等价的
docker exec -it 容器id  /bin/bash
docker exec -it 容器名称 /bin/bash
#不行的话吧/bash换成/sh
docker exec -it weather  /bin/sh


#方式二
docker attach 容器id

#方式一进入容器后开启一个行的终端,可以在里面操作(常用)  退出容器终端时,不会导致容器的停止。
#方式二进入容器正在执行的终端,不会启动新的进程         退出容器时,会导致容器的停止。

退出容器

exit     #容器停止并退出
Ctrl+P+Q #容器不停止,并且退出
查看容器中进程信息
#docker top 容器id
[root@VM-4-6-centos ~]# docker top da9772ffcacb                             
查看获取容器/镜像的元数据(不常用)
#docker inspect 容器id

Docker数据卷

例如需要修改容器内配置文件,每次需要进入容器,十分的麻烦.

可以通过数据卷,将文件挂载到我们的宿主主机,直接修改文件,即可实现数据共享

image-20221009203227897

创建数据卷

docker volume create volumename 

查看数据卷详细信息 Mountpoint为数据在本机存储的位置,如果磁盘存储空间不足可修改此位置

docker volume inspect volumename

image-20221009203822300

列出所有数据卷

docker volume ls

删除数据卷

docker volume rm volumename
#删除不再使用的 docker volume 对象
docker volume prune

image-20221009204246104

如果容器运行时,volume不存在,会自动创建出来

#创建容器并挂载数据卷到容器内html目录
docker run --name mn -p 3344:80 -v html:/usr/share/nginx/html -d nginx
#查看html数据卷位置
docker volume inspect html
#进入该目录
cd /www/server/docker/volume/html/_data
#修改文件
vim index.html

image-20221009204702958

修改了nginx的index.html,可以发现已经容器内的修改已经生效了

image-20221010121658642

小结

image-20220420145507062

作业练习
1:docker安装nginx
#1:搜索镜像
docker search nginx
#2:下载镜像
docker pull nginx
#3:查看镜像
[root@VM-4-6-centos ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    12766a6745ee   3 weeks ago    142MB
centos       latest    5d0da3dc9764   7 months ago   231MB
-d 后台运行
--name给容器起名  
-p linux端口:容器内部端口
[root@VM-4-6-centos ~]# docker run -d --name nginx01 -p 3344:80 nginx
#curl localhost:3344  需要在安全组放行次端口

进入容器
[root@VM-4-6-centos ~]# docker  exec -it nginx01 /bin/bash
root@4b781c444756:/# ls
bin  boot  dev	docker-entrypoint.d  docker-entrypoint.sh  etc	home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@4b781c444756:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@4b781c444756:/# cd /etc/nginx
root@4b781c444756:/etc/nginx# ls
conf.d	fastcgi_params	mime.types  modules  nginx.conf  scgi_params  uwsgi_params

image-20220420155723951

2:docker安装Tomcat
#1:搜索镜像
docker search nginx
#2:下载镜像
docker pull nginx
#3:运行镜像
[root@VM-4-6-centos~]# docker run -d -p 3355(外部linux):8080(容器内部) --name tomcat01 tomcat:[tag] 不填tag默认是latest需要在安全组放行次端口

CONTAINER ID   IMAGE    COMMAND                STATUS          PORTS                                       NAMES
426bc2db09dd   tomcat   "catalina.sh run"      Up 15 minutes   0.0.0.0:3355->8080/tcp,:::3355->8080/tcp    tomcat01
4b781c444756   nginx   "/docker-entrypoint.…"  Up 44 minutes   0.0.0.0:3344->80/tcp,:::3344->80/tcp        nginx01

#4:进入容器
#docker exec -it tomcat01 /bin/bash
发现问题:1:linux命令少了2:webapps里没有东西,阿里云镜像的问题,默认是最小的镜像,所有不必要的东西不会下载
#保证最小可运行环境
将webapps.dist文件复制到webapps里面,公网就可以访问到Tomcat了
# cp -r webapps.dist/* webapps

image-20220420155709571

Docker可视化管理工具
  • portainer(先用这个)

  • Rancher(CI/CD再用)

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

    什么是portainer?

    Docker图形化管理界面!提供一个类似swagger的后台给我们操作!

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

    访问测试:服务器IP:8088

    http://121.4.32.107:8088   #服务器IP:8088  密码:我的名字拼音+2000415
    

    进入页面,输入密码—>create user—>local

    image-20220420160734706

可以看到本地docker的一些数据~

image-20220420161913485

Docker镜像详解

镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时(一个程序在运行或者在被执行的依赖)、库,环境变量和配置文件。应用可以直接打包docker镜像,就可以直接Run起来

如何得到镜像
  • docker hub远程下载
  • 朋友拷贝
  • docker file 生成一个镜像
镜像加载原理

Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统是UnionFS联合文件系统。

image-20220420164926964

分层理解

可以去下载一个镜像,观察下日志的下载输出,可以看到是一层层在下载

image-20220420170925483

image-20220420170610704

#docker image inspect redis:latest

 "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:87c8a1d8f54f3aa4e05569e8919397b65056aa71cdf48b7f061432c98475eee9",
                "sha256:5c4e5adc71a82a96f02632433de31c998c5a9e2fccdcbaee780ae83158fac4fa",
                "sha256:7d2b207c26790f693ab1942bbe26af8e2b6a14248969e542416155a912fec30d",
                "sha256:2c7498eef94aef8c40d106f3e42f7da62b3eee8fd36012bf7379becc4cd639a2",
                "sha256:4eaf0ea085df254fd5d2beba4e2c11db70a620dfa411a8ad44149e26428caee4"
            ]
        },

提交镜像

使用docker commit 命令提交容器成为一个新的版本

docker commit -m=“提交的描述信息”  -a="作者" 容器id 目标镜像名:[TAG] 
实战测试
#启动一个默认的Tomcat


#发现默认的Tomcat,webapps里没有文件,是因为官方镜像下载是默认没有文件的


#自己拷贝webapp.dist文件到webapps里   -r表示递归    cp表示复制  -r表示递归处理,将指定目录下的文件与子目录一并处理。
root@a3851a229905:/usr/local/tomcat# cp -r webapps.dist/* webapps

容器数据卷

什么是容器数据卷

将我们的应用,和环境打包成一个镜像!

数据?如果都在容器中,那么我们的容器删除,数据就会丢失!!需求:数据可以持久化

容器间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地----使用数据卷

匿名挂载和具名挂载

具名挂载的顾名思义就是有名字,这个名字是我们自己给取的

匿名挂载的意思就是不指定名字,让系统给他默认生成一个长长的字符串作为名字。

#匿名挂载
docker run -d -P --name nginx -v /etc/nginx nginx

#查看所有的volume情况
docker volume ls
#发现,这种就是匿名挂载,我们在-v只写了容器内的路径,没有写容器外的路径
local     228aedc0f53e38ff6e0be5e38a90340290a0b785b281313e37754bab0e8db6a9
#具名挂载
docker run -d -P --name nginx02 -v juming-ngnix:/etc/nginx nginx

#docker volume ls
DRIVER    VOLUME NAME
local     228aedc0f53e38ff6e0be5e38a90340290a0b785b281313e37754bab0e8db6a9
local     ac5de819787d86c173ab95f1fa02b76b74299756ec3149ad26b0af39a653dff4
local     juming-nginx


image-20220429144715878

所有docker容器内的卷,没有指定目录都是在==/www/server/docker/volumes/juming-ngnix/_data’==下

#如何区别是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径     #匿名挂载 
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径::容器内路径 #指定路径挂载

方式一:直接使用命令来挂载 -v (具名挂载)

docker run -it -v  主机目录:容器内目录

#测试
[root@VM-4-6-centos home]# docker run -it -v /home/ceshi:/home centos /bin/bash

#启动起来后通过 docker inspect 容器id

image-20220421142948462

image-20220421143546501

初始DockerFile

方式二:DockerFile

Docker File就是用来构建docker镜像的文件!!命令脚本!!

通过这个脚本,可以镜像,镜像是一层一层的

#创建一个dockerfile文件,名字可以随机
#文件中的内容,大写
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "-----end-----"

CMD /bin/bash
#里面的每个命令,就是镜像的一层

#启动自己写的容器
[root@VM-4-6-centos docker-test-volume]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
bzovo/centos          latest    e7682a765cc5   5 minutes ago   231MB

[root@VM-4-6-centos docker-test-volume]# docker run -it e7682a765cc5 /bin/bash

DockerFile

Docker File就是用来构建docker镜像的文件!!命令脚本!!

构建步骤

  1. 创建编写一个dockerfile文件

  2. docker build构建为一个镜像

  3. docker run运行镜像

  4. docker push 发布镜像(到DockerHub)

    image-20220429154754130

DockerFile介绍

Docker镜像逐渐成为企业交付的标准,必须要掌握、

DockerFile:构建文件,定义了一切步骤

DockerImages:通过dockerfile构建生成的镜像,最终发布和运行的产品

DockerContainer:容器就是镜像运行起来提供服务器

DockerFile指令

FROM       #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN        #镜像构建的时候需要运行的命令
ADD        #添加内容,类似COPY,会自动帮我们解压文件!!!
WORKDIR    #镜像的工作目录,进入容器时,默认进入的目录
VOLUME     #挂载的目录
EXPOST     #暴露端口配置,在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
CMD        #指定这个容器启动时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动时候要运行的命令,可追加命令
ONBUILD    #当构建一个被继承的DockerFile这个时候就会运行ONBUILD的指令,触发指令

COPY       #类似ADD,将我们宿主机文件拷贝到镜像中
格式: COPY <src> <dest>  
详解:复制本地主机的 <src>下内容到镜像中的 <dest>,目标路径不存在时,会自动创建。
<src>:可以是 Dockerfile 所在目录的一个相对路径(文件或目录)

ENV        #构建的时候设置环境变量  

image-20220429173952394

实战测试

创建自己的Centos镜像

#1:编写DockerFile文件
FROM centos
MAINTAINER ziyun<572308036@qq.com>

ENV MYPATH /usr/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-centos -t mycentos:0.1 .
    docker build -f dockerfile文件名 -t 镜像名:[tag]
Successfully built 36abcb2d3643
Successfully tagged mycentos:0.1

查看我们自己创建的Centos镜像

#docker run -it mycentos:0.1
[root@5ff1f9122f2d local]# pwd
/usr/local    #可以看到进去容器的时候,默认就是/usr/local
              #这和我们上面设置的WORKDIR有关

image-20220429184809319

查看镜像变更历史

docker history 镜像id

image-20220429184739266

发布自己的镜像

1:Docker Hub

1:地址 https://www.docker.com/products/docker-hub/注册账号

2:确定账号登陆正常

3:服务器上提交自己的镜像

[root@VM-4-6-centos ~]# docker login --help 
#docker login   登陆
#docker logout  登出、退出
Usage:  docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username
#docker login -u bzovo0415
#Password: 输入密码

4:推送我们的镜像到Docker Hub

REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
mycentos              0.1       36abcb2d3643   17 hours ago    591MB
#docker push mycentos:0.1  docker push REPOSITORY ID:TAG    这里的tag必须是本地存在的

REPOSITORY               TAG       IMAGE ID       CREATED         SIZE
bzovo0415/bzovo-centos   1.0       36abcb2d3643   17 hours ago    591MB
bzovo-centos             1.0       36abcb2d3643   17 hours ago    591MB、

#给镜像打tag
#docker tag 36abcb2d3643 bzovo-centos:1.0   docker tag imageID 新镜像名:tag号
TODO:为什么Push到docker hub之前要给镜像打tag?
#推送镜像
#docker push bzovo0415/bzovo-centos:1.0  docker push 用户名/镜像名称:[tag]

Docker部署Springboot项目

springboot打包错误:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0...
  ==修改maven-resources-plugin的版本==
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>

        <!--在这里修改版本-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.4.3</version>
        </plugin>
        <!---->
    </plugins>
</build>

1:打包好后上传我们的Dockerfile和jar包

image-20220501124255142
2:附上编写的Dockerfile

FROM openjdk:8-jdk-alpine

LABEL maintainer="ziyun.xu2@dxc.com"

COPY *.jar /springboot/service-sms-0.0.1-SNAPSHOT.jar

EXPOSE 8005

ENV TZ="Asia/Shanghai"

CMD ["java", "-jar", "/springboot/service-sms-0.0.1-SNAPSHOT.jar"]


3:进入到我们上传Dockerfile目录(/www/wwwroot)

4:docker build -t bzovo-keshe .  通过Dockerfile构建镜像 .  系统会自动去找Dockerfile名字的文件

#docker log -f -t --tail 100 container_id 查看容器日志
5:docker logs -f -t --tail 100 bf185badda5e

#容器运行命令 -d 保持后台运行 -p指定 主机(宿主)端口:容器端口 --name给运行容器命名 94f4791466b4 container id(容器id)
6:docker run -d -p 9999:9999 --name bzovo 94f4791466b4
#进入容器命令  weather  
7:docker exec -it weather  /bin/sh
#尝试访问
7:121.4.32.107:9999  发现服务已经跑起来了

Docker部署时区慢了8H解决方案

原因:是因为docker容器中的时间是UTC,相比中国时间慢了8H

查看时区:date

有以下两种解决方案

1:把本机时区复制到宿主机即可:

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

2:创建dockerfile文件的时候,自定义该镜像的时间格式及时区

在dockerfile文件里添加RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

3:修改服务器时间

date 查看服务器时间

date -s 10:34 修改时区时间

4:tzselect 同步时区

image-20221107201812804

实例

image-20221031203837021

查看建立的软链接

ls -il

image-20230307190751439

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值