docker入门教程

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 <

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:镜像名称

docker入门教程

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服务器)中的一个目录或文件
  • 当容器目录和数据卷目录绑定后,对方的修改会立即同步
  • 一个数据卷可以被多个容器同时挂载
  • 一个容器也可以挂载多个数据卷

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

docker入门教程

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

docker入门教程

3、客户端登陆测试

docker入门教程

详情参考我的博客: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 :

MAINTAINER

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

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
ENV MYPATH /home/xxx
使用,此时$MYPATH = /home/xxx
$MYPATH

ADD :

  • 将宿主机目录下的文件拷贝进镜像
  • 如果拷贝的是一个 tar 文件,会自动解压为目录。
#格式:
ADD
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

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

Original: https://www.cnblogs.com/galenblog/p/16623314.html
Author: 黎华扬
Title: docker入门教程

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/569213/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringBoot进阶教程(七十四)整合ELK

    在上一篇文章《SpringBoot进阶教程(七十三)整合elasticsearch 》,已经详细介绍了关于elasticsearch的安装与使用,现在主要来看看关于ELK的定义、安…

    Java 2023年6月8日
    072
  • Spring Boot:整合MyBatis框架

    综合概述 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBa…

    Java 2023年5月30日
    0111
  • idea主类main左侧栏启动按钮消失原因

    我去找网上的方法发现都是去调正”项目结构”中的model设置,而我本地的model并没有问题,但是我还是删除model重加载,发现依然无效,经过我再三检测我…

    Java 2023年6月13日
    074
  • Java的抢占式调度

    关于线程的调度 ​ 哪个线程的优先级比较高,抢到的cpu时间片的概率就高一点。 ​ java采用的就是抢占式的调度方法 ①、 setPriority(int newPriority…

    Java 2023年6月9日
    064
  • 企业级Nginx负载均衡与keepalived高可用实战(二)keepalived篇

    1、Keepalived高可用软件 1.1、Keepalived介绍 Keepalived软件起初是专门为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态…

    Java 2023年5月30日
    061
  • 事务的隔离级别详解

    四种隔离级别: READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更, 可能会导致脏读、幻读或不可重复读 。 READ-COMMITTED(…

    Java 2023年6月5日
    0101
  • nginx日志分析解决方案- Awstats

    很多PHP搭建的网站都在由apache转向了nginx。nginx的日志信息如何分析呢? 当然你可以自己写一个,但是这里也推荐一款结果信息非常详尽的开源工具——Awstats ,它…

    Java 2023年5月30日
    086
  • Java之异常

    Java 异常类层次结构图概览 : Exception 和 Error 有什么区别? 在 Java 中,所有的异常都有一个共同的祖先 java.lang 包中的 Throwable…

    Java 2023年6月7日
    095
  • 4.MySQL动态拼接

    举例如下: posted @2022-09-06 23:07 NIANER2011 阅读(7 ) 评论() 编辑 Original: https://www.cnblogs.com…

    Java 2023年6月13日
    087
  • C#与Java互通AES算法加密解密

    /// /// <returns>&#x5BC6;&#x6587;</returns> public static string Encod…

    Java 2023年5月29日
    079
  • nginx url自动加斜杠的问题

    内部服务器使用nginx,做网站测试之用。不同域名使用端口号区分,如www用默认的80端口,其它域名用81,82… 有时直接在地址栏敲网址,会发现跳转到localhos…

    Java 2023年5月30日
    073
  • 解决springboot打不出业务log

    今天不知道咋回事,单独的module可以打出log,而start的web工程始终打不出来,直觉就是jar包冲突,log的包太多了,logback自己跪了,后来经过尝试,得出如下的组…

    Java 2023年5月30日
    0126
  • 面向对象ooDay3

    在派生类的构造方法中若没有调用超类的构造方法,则默认super()调用超类的无参构造方法 public class SuperDemo { public static void m…

    Java 2023年6月13日
    055
  • 链表——数据结构

    1.翻转链表 给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。 示例1: 输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] 示例2:…

    Java 2023年6月7日
    090
  • leetcode 83. Remove Duplicates from Sorted List 删除排序链表中的重复元素(简单)

    一、题目大意 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 示例 1: 输入:head = [1,1,2]输出:[1,…

    Java 2023年6月14日
    0125
  • MySQL相关事项

    重启MySQL service mysql stop service mysql start service mysql restart 创建MySQL用户并允许远程访问 CREA…

    Java 2023年6月5日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球