💖5分钟带你自定义镜像和安装软件💖Docker系列入门教程

998 阅读6分钟

这是我参与8月更文挑战的第21天,活动详情查看:8月更文挑战

🌈往期回顾

    感谢阅读,希望能对你有所帮助,博文若有瑕疵请在评论区留言或在主页个人介绍中添加我私聊我,感谢每一位小伙伴不吝赐教。我是XiaoLin,既会写bug也会唱rap的男孩

五、Docker安装软件

5.1、Docker安装MySQL

拉取镜像

# 安装的是 mysql 8.0
docker pull mysql:latest

启动容器

# -e是指定环境变量
docker run -p 3306:3306 -e MYSQL_DATABASE=workdb -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

进入容器

# 这里的容器id要根据实际情况替换
docker exec -it 3e8bf7392b4e bash

登录 MySQL

mysql -u root -p

修改密码

ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

授权远程登录访问

CREATE USER 'wkcto'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; 
GRANT ALL PRIVILEGES ON *.* TO ' wkcto'@'%';

5.2、Docker安装Nginx

拉取镜像

docker pull nginx

启动容器

docker run -d -p 80:80 nginx

进入容器

# 这里的容器id要根据实际情况替换
docker exec -it 3e8bf7392b4e bash

5.3、 Dokcer安装Zookeeper

拉取镜像

docker pull zookeeper

启动容器

docker run -p 2181:2181 -d zookeeper

进入容器

# 这里的容器id要根据实际情况替换
docker exec -it 3e8bf7392b4e bash

六、Docker 自定义镜像

6.1、认识 Dockerfile文件

    Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。 Dockerfile 用于构建 Docker 镜像,Dockerfile 文件是由一行行命令语句组成,基于这些命令即可以构建一个镜像。

6.2、Dockerfile的基本结构

    Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。 我们一般把Dockerfile文件分为四部分:

  1. 基础镜像信息。
  2. 维护者信息
  3. 镜像操作指令。
  4. 容器启动时执行指令。

6.3、Dockerfile指令

6.3.1、FROM

    Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。Dockerfile 文件的第一条指令必须为 FROM 指令。并且,如果在同一个 Dockerfile 中创建多个镜像时,可以使用多个 FROM 指令(每个镜像一次),他所指定的镜像比如是已经存在的镜像,我们称为基础镜像,语法格式:

FROM 镜像名称
# 或者是
FROM 镜像名称:版本号

6.3.2、MAINTAINER

用于指定作者信息,语法格式为:

MAINTAINER 作者名称

6.3.3、RUN

    Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像,当命令较长时可以使用 \ 来换行。每个RUN命令都会在当前镜像的上层创建一个新的镜像来运行指令,语法格式为:

RUN 需要执行的命令
# 示范
RUN echo xiaolin

6.3.4、EXPOSE

    Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。 指定运行该镜像的容器使用的端口,虽然我们在构建镜像的时候暴露了端口号,但是我们在运行容器的时候依然需要指定端口的映射。 我们使用EXPOSE只是告诉Docker运行该镜像的容器会使用80端口,出于安全的考虑,Docker并不会打开该端口,所以我们需要在使用该镜像运行容器的时候指定端口的映射。语法格式为:

EXPOSE 端口号

6.3.5、CMD

    Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。 CMD指令提供容器默认运行的命令,RUN指令类似.都是执行一个命令。但是RUN命令指定的命令是在镜像构建的过程运行的,CMD的命令是在容器运行的时候运行的。     如果我们在docker run命令中指定运行的命令的时候,CMD的指令会被覆盖,默认命令就不会执行。

6.3.6、ENTRYPOINT

    这个命令和1CMD指令十分相似,他和RUN指令不同的是,他不会被docker run的启动命令给覆盖。

6.3.7、ADD

    将文件和目录复制到使用dockerfile构建的镜像中,目标的来源可以本地的地址也可以是远程地址.。

    如果是本地地址,本地地址必须是构建目录中的相对地址。对于远程URL,docker并不推荐使用,更建议使用的是curl或者wget的命令来获取,目标路径需要指定镜像中的绝对路径。

6.3.8、VOLUME

    用于基于镜像创建的容器添加卷,一个卷可以存在一个或者多个容器的特定目录。这个目录可以绕过联合文件系统.提供共享数据和持久化数据的功能。

6.3.9、WORKDIR

    这个指令是从指令创建一个容器,在容器内部设置工作目录。ENTRYPOINT和CMD的命令都会在这个目录下执行,我们也可以使用这个命令给后续的构建中指定工作目录。通常会使用绝对路径,如果使用了相对路径,那这个路径会一致传递下去。

6.3.10、USER

        指定镜像会以什么样的用户去运行,如果没有指定USER,容器会使用root用户来运行。语法格式:

USER xiaolin

6.3.11、ONBUILD

    镜像触发器,当一个镜像被其他镜像作为基础镜像时执行,会在构建过程中插入指令。

6.3.12、ENV

    这个指令主要是来设置环境变量,这个环境变量在构建过程中和运行过程中都有效。比如配置JDK环境:

ENV JAVA_HOME /usr/local/jdk1.8.0_121
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin

6.4、使用DockerFile自定义镜像

我们创建存放Dockerfile文件的目录和Dockerfile文件

编写Dockerfile文件

from centos:latest
maintainer xiaolin
RUN yum install -y epel-release
RUN yum install -y nginx
EXPOSE 80

使用build命令构建镜像

docker build -t 'nginx_mirror' .

通过镜像构建容器

# -p 80后面接的是你build的时候指定的名字
docker run -itd --name nginx_env1 -p 80 nginx_mirror