不要在该奋斗的年纪选择了安逸;|

黎华扬

园龄:8年1个月粉丝:4关注:3

docker入门教程

docker入门

1、简介

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

官网文档:https://docs.docker.com/

官网镜像:https://hub.docker.com/

1.1、docker是什么

Docker的思想来自于集装箱,集装箱解决了什么问题?

在一艘大船上,里面有着集装箱,集装箱和集装箱之间不会互相影响。

那么我就不需要专门运送水果的船和专门运送化学品的船了。那我就可以用一艘大船把他们都运走。

docker就是一艘船,里面存放着各种各样的环境,他们互不影响。

1.2、为什么用docker

  • 部署环境快。
  • 易扩容。
  • 管理简单。

只在在Docker里安装好镜像。

在别的Docker上就能还原一模一样的镜像。

解决了应用环境的问题。

这样就决绝了“开发环境能跑,一上线就崩”的尴尬。

2、docker安装

如果是安装docker desktop, 这里可以跳过。

docker deskop下载地址:https://www.docker.com/get-started/

1、由于可能需要更新yum,这里提前更改wget源(可选)。

yum -y install wget
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
mv CentOS7-Base-163.repo /etc/yum.repos.d/CentOS-Base.repo
yum clean all
yum makecache

2、安装docker

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

# 配置镜像加速器[可以上阿里云配置自己的加速镜像]
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://922lpw54.mirror.aliyuncs.com"]
}
EOF

# 启动docker引擎并设置开机启动
sudo systemctl start docker
sudo systemctl enable docker

# 配置当前用户对docker的执行权限
sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo systemctl restart docker

# 启动docker
systemctl start docker    
# 查看docker运行状态
systemctl status docker
# 关闭docker
systemctl stop docker

3、卸载docker

# 1、停用docker
systemctl stop docker
# 2、查看yum安装的docker文件包
yum list installed |grep docker
# 3、查看docker相关的rpm源文件
rpm -qa | grep docker
# 4、删除所有安装的docker文件包
yum remove docker-ce docker-ce-cli containerd.io
# 5、删除docker的镜像文件,默认在/var/lib/docker目录下
rm -rf /var/lib/docker
# 到此docker卸载就完成了,再执行docker -v就无法识别命令了。

3、docker基础命令

3.1、镜像操作

1.查询镜像

docker search 镜像名称

2.拉取镜像

# docker pull 镜像名称:版本号
# 例子:如果不加版本,就是获取最新版本的
docker pull redis
docker pull redis:5.0

# 查看本地镜像
docker images
# 删除镜像
docker rmi [镜像id:镜像名]

3.2、容器操作

1、运行容器

docker run -d  --name=redis -p 6379:6379
-v /mydata/redis/conf:/usr/local/etc/redis redis
  • -d:后台运行。
  • --name:容器叫什么名字
  • -p:端口映射,【向外端口,内部端口】
  • -v:挂载目录,【物理目录:容器内部目录】
  • redis:镜像名称

2、容器常规操作

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

# 开始容器
docker start 容器名/容器id

# 重启容器
docker restart 容器名/容器id

# 停止容器
docker stop 容器名/容器id

#删除容器、删除全部容器 -f 强制删除
docker rm 容器名/容器id

#查看容器信息或镜像信息
docker inspect 容器名/容器id/镜像id

#查看容器日志
docker logs 容器名

# 拷贝文件,容器内部路径 --> 物理路径
docker cp 容器:/home/test.txt /home

# 容器重命名
docker rename container_name new_name

4、数据卷

4.1、什么叫数据卷?

首先要知道为什么有数据卷这个东西?

因为使用容器有存在一些问题,例如:

场景:一个mysql的容器里面有很多数据库,突然容器运行不起来了,只能删除这个容器通过镜像重新运行一个,容器删除了,容器中的数据也随之销毁,数据我们只能重新创建,这是很头疼的,也是我们不希望发生的。因此产生三个问题:

1.docker容器删除后,在容器中产生的数据如何存储备份?

2.docker容器和外部机器可以直接交换文件吗?

3.容器之间如何数据交互?

数据卷为什么可以解决这些问题:

  • 数据卷是宿主机(例如:你的虚拟机linux服务器)中的一个目录或文件
  • 当容器目录和数据卷目录绑定后,对方的修改会立即同步
  • 一个数据卷可以被多个容器同时挂载
  • 一个容器也可以挂载多个数据卷

简单来说,数据卷就是物理机的目录容器内的目录做一个绑定

4.2、数据卷的作用?

数据卷是被设计用来持久化数据的,它的生命周期独立于容器。

Docker不会在容器被删除后自动删除数据卷。

简单来说,数据卷用来保存容器里的数据的。不会因容器的烧毁而烧毁。

docker run -d  --name=redis -p 6379:6379
-v /mydata/redis/conf:/usr/local/etc/redis redis
  • 通过 -v 来进行数据卷的挂载。

到这了一步,大部分容器都可以启动起来,并进行管理了。

我们下一步就来部署一下开发环境。

5、docker部署环境

5.1安装MySQL

1、配置Mysql文件

# 1、先创建配置文件
vi /mydata/mysql/conf/my.cnf
# 2、添加配置信息
[client]
default-character-set=utf8
 
[mysql]
default-character-set=utf8
 
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names=1
# 填写完要退出,先按【ESC】键,之后再到末尾按照需求执行退出命令
:wq

2、启动Mysql

# 1、获取镜像
docker pull mysql:5.7.29
# 2、运行镜像
docker run -p 3306:3306 --name mysql01 \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart=always -d mysql:5.7.29
  • -v /mydata/mysql/data:
  • -e MYSQL_ROOT_PASSWORD=123456:设置root密码为123456。
  • --restart=always 开机自启

如何使用mysql里面的命令行?

#1、进入docker里面的mysql命令行
docker exec -it mysql /bin/bash
#2、登录mysql
mysql -uroot -p
#、容器里的退出
exit

3、客户端登陆测试

详情参考我的博客:https://www.cnblogs.com/galenblog/p/16621162.html

6、Dockerfile

官方参考文档:

https://docs.docker.com/engine/reference/builder/

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

6.1、初入门

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

使用 DockerFile 构建一个新的镜像有 3 个步骤:

  1. 编写 DockerFile 文件
  2. 根据 DockerFile 文件,使用 docker build 构建镜像
  3. docker run 启动一个容器实例

构建一个springboot项目的Dockerfile文件

FROM java:8

COPY *.jar /app.jar

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

EXPOSE 8081

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

6.2、常用关键字

docker 指令用于编写 dockerfile 文件,通过指令可以自定义特定功能的镜像。

FROM

  • 基础镜像。

  • 表明当前新镜像是基于哪个镜像生成的

  • 第一条指令必须为 FROM 指令。

# 格式,不加版本号就是最新版本
FROM <image>:<tag>

MAINTAINER

  • 镜像维护者的姓名和邮箱地址(一般用不上。)
# 格式
MAINTAINER <name>

RUN:

  • 容器构建时需要运行的命令,等于shell 终端中运行命令。
# 格式
RUN tar zxvf yasm-1.3.0.tar.gz

CMD:

  • 有两个意思:一个相当于终端中运行命令,一个是为 ENTRYPOINT 提供给默认参数。
  • 每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行
#格式1:使用 exec 执行,推荐方式
CMD ["executable","param1","param2"]
#格式1:使用 /bin/sh 执行
CMD command param1 param2
#格式2:提供参数
CMD ["param1","param2"]

EXPOSE:

  • 设置当前容器对外暴露出的端口.
  • 通过启动容器时用 -P 来映射。
# 格式,多个端口可以在后面追加
EXPOSE 8080 8081

ENV

  • 设置环境变量
# 格式
# ENV <key> <value>
ENV MYPATH /home/xxx
# 使用,此时$MYPATH = /home/xxx
$MYPATH

ADD:

  • 将宿主机目录下的文件拷贝进镜像
  • 如果拷贝的是一个 tar 文件,会自动解压为目录。
#格式:
ADD <src> <dest>
# src:那个目录 dest:要添加在镜像里的目录
# 路径支持正则,例如:ADD *.jar /app/

COPY:

  • 与ADD相似,一个会自动解压,一个不会
COPY *.jar /app

WORKDIR:

  • 指定在创建容器后,终端默认登陆的进来工作目录。
# 格式
WORKDIR /app/
# 可以使用环境变量
WORKDIR $MYPATH

VOLUME:

  • 创建一个数据卷挂载点。
#格式为:
VOLUME ["/data"]

ENTRYPOINT :

  • 配置容器启动后执行的命令
  • 每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
#两种格式:
ENTRYPOINT ["executable", "param1", "param2"]
#shell中执行
ENTRYPOINT command param1 param2

实战:dockerfile制作tomcat镜像


FROM centos
MAINTAINER zhangpeng<1477237223@qq.com>

COPY readme.md /usr/local/readme.md

ADD jdk-8u301-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.56.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

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

EXPOSE 8080

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

具体可以参考:https://blog.csdn.net/FeiChangWuRao/article/details/122228112

6.3、构建镜像

需要将编写好的 dockerfile 构建镜像。

# 语法,后面的 . 表示当前目录。
docker build -t 新镜像名字:TAG .

构建完的镜像可以通过命令查看

# 查看镜像
docker images
# 运行镜像
docker run -d -p 8080:8080 --name xxx -v xxx:xxx 镜像

7、发布镜像

可以通过Docker官网发布自己的镜像。

这里我就不多展示。

8、镜像备份

作用:可以快速恢复备份时的环境。

主要使用:saveload 来操作

8.1、镜像导出

# 1、查看本地docker镜像
docker images
# 2、导出镜像,将多个文件保存成一个镜像,一次导出
# docker_back_images.tar 导出文件名,
docker save -o  docker_back_images.tar nginx:latest mysql:5.7.29 openjdk:8-jdk-alpine

8.2、镜像导入

# 1、将docker_back_images.tar 上传到服务器
# 2、导入镜像
docker load < docker_back_images.tar

具体可以参考:https://blog.csdn.net/qq_44273583/article/details/114387368


文章写到这了,我们下期再见。


参考文章:https://www.cnblogs.com/hyx1229/p/15894421.html

本文作者:黎华扬

本文链接:https://www.cnblogs.com/galenblog/p/16623314.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   黎华扬  阅读(162)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起