docker入门教程
docker入门
1、简介
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 个步骤:
- 编写 DockerFile 文件
- 根据 DockerFile 文件,使用 docker build 构建镜像
- 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、镜像备份
作用:可以快速恢复备份时的环境。
主要使用:save
和 load
来操作
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/galenblog/p/16623314.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步