目录
- centos 安装和使用 docker
- docker拉取mysql
- 使用可执行文件制作docker镜像
- Dockerfile文件优化
- Dockerfile简介
- Dockerfile优化
centos 安装和使用 docker
yum install docker
systemctl start docker
systemctl status docker# 查询docker版本
docker version
# 查询docker基础信息
docker info
# docker帮助命令手册
docker --help
docker search 超时问题
# docker search mysql 超时问题,大多是DNS污染造成,无法解析对应ip
# 安装dig软件包
yum install bind-utils
# 查询dns服务器的域名记录,得到ip地址
dig @114.114.114.114 index.docker.io
# hosts文件添加域名解析ip:54.227.20.253 index.docker.io
vim /etc/hosts
# 此时可以执行search查询
docker search mysql
配置国内镜像源
# 使用阿里云docker镜像加速器,https://cr.console.aliyun.com,支付宝扫码登录
vim /etc/docker/daemon.json
{"registry-mirrors": ["https://******.mirror.aliyuncs.com"]
}
# 启动配置
systemctl daemon-reload
# 重启docker服务
systemctl restart docker
- 配置了国内镜像源(比如阿里的docker镜像源)是对search没有用的,因为docker命令最后还是通过他自己的地址搜索镜像。
- 但是配置了国内镜像源可以加快pull拉去镜像的速度。
docker拉取mysql
docker search mysql
# 拉取最新版本
docker pull mysql
# 拉取指定版本
docker pull mysql:5.7.8# 查看下载好的镜像文件
docker images
docker容器的启动和停止
# 运行容器
docker run --name mysql1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
# 查看正在运行的容器
docker ps
# 查看所有容器
docker ps -a
# 停止运行的容器
docker stop [CONTAINER ID]
# 启动docker中的容器
docker start [CONTAINER ID]
# 重启docker容器
docker start [CONTAINER ID]
# 删除容器
docker rm [CONTAINER ID]
进入容器,操作mysql
# 进入容器
docker exec -it [CONTAINER ID] /bin/bash
# 退出容器
exit
# 进入容器后,登录mysql,输入密码123456
mysql -u root -p
# 查询mysql版本
SELECT VERSION();
# 修改 root 用户在 %(所有主机)上的密码
ALTER USER 'root'@'%' IDENTIFIED BY '123456';
# 授予 root 用户所有数据库的所有权限,并允许该用户授予权限给其他用户。
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
# 刷新权限,使更改立即生效
FLUSH PRIVILEGES;
# 退出
exit
阿里云服务器mysql远程访问设置
- 关闭防火墙,或开放3306/tcp端口权限
ufw allow 3306/tcp
- 阿里云服务器管理页面,添加防火墙规则,开放TCP/3306
- 设置完成后,使用Navicat(https://www.navicat.com.cn/products)可远程登录阿里云服务器上的mysql
mysql默认4个库
- 1.information_schema
用途:这是一个信息数据库,存储了 MySQL 服务器维护的所有其他数据库的信息。例如,它包含了关于数据库中的表、列、索引、用户权限等各种元数据 - 2.mysql
用途:主要用于存储 MySQL 的用户账户信息、权限设置、一些存储过程和函数等。它是 MySQL 系统正常运行和安全管理的关键数据库 - 3.performance_schema
用途:用于监控 MySQL 服务器的性能相关信息。它提供了一种方式来查看服务器在运行过程中的性能指标,如查询执行时间、锁等待情况、内存使用等细节。 - 4.sys
用途:这是一个通过视图和存储过程来帮助数据库管理员更方便地理解和管理 MySQL 服务器的数据库。它是基于information_schema和performance_schema中的数据构建的,提供了更简洁易用的接口来获取数据库系统相关信息。
mysql 基础命令
# 查看MySQL有哪些库
SELECT DATABASES;# 选择information_schema作为当前操作的默认数据库,使用USE指定库后,sql语句可以省略库名
USE information_schema;
# 显示当前库里所有表
SHOW TABLES;# mysql.user 表存储用户账户信息
# User:存储用户名。
# Host:存储允许用户登录的主机地址。可以是具体的 IP 地址、主机名或%(表示允许从任何主机登录)。
# authentication_string:存储用户的密码,可能是加密后的。
SELECT Host, User, authentication_string FROM mysql.user;
# 添加新用户
CREATE USER 'chw'@'localhost' IDENTIFIED BY '123456';
# 修改用户密码
ALTER USER 'chw'@'localhost' IDENTIFIED BY '123';
# 给用户chw在指定主机上授予table_name表的SELECT和INSERT权限
GRANT SELECT, INSERT ON database_name.table_name TO 'chw'@'localhost';# 创建库
CREATE DATABASE school;
# 创建表
CREATE TABLE students (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,age INT,email VARCHAR(200) UNIQUE
);
使用可执行文件制作docker镜像
使用C++开发的可执行文件nethello制作镜像。在nethello可执行文件目录创建 Dockerfile 文件。
先拉取gcc
docker pull gcc
创建Dockerfile文件
vim Dockerfile
FROM gcc:latest
RUN mkdir /usr/src/myapp
COPY nethello /usr/src/myapp
WORKDIR /usr/src/myapp
CMD ["./nethello"]
制作docker镜像
# 当前Dockerfile文件目录,创建镜像,tag版本v1,等待一会
docker build -t nethello:v1 .
# 查看镜像,已有nethello
docker images
# 删除镜像
docker rmi nethello:v1
# 启动镜像,不需要传参可直接启动
docker run -d nethello:v1
# 如果启动失败可以查看日志,容器名通过docker ps -a查询
docker logs 容器名
# 启动镜像,可以自定义传参,覆盖Dockerfile里的传参,注意-p 9090:9090端口映射在-d选项的前面
docker run --name nethellov1 -p 9090:9090 -d nethello:v1 ./nethello -s -p 9090 -P
# 查看日志
docker logs nethellov1
镜像打包,拷贝到其他机器运行。
这里的环境:docker在centos制作,拷贝到ubuntu系统正常运行。
# 打包镜像,在当前目录生成nethello.tar
docker save -o nethello.tar nethello:v1# 把镜像文件拷贝到其他机器上,将镜像加载到本地 Docker 环境中
docker load -i nethello.tar
# 查看镜像,已有nethello
docker images
# 参考上面的命令运行docker容器
# 进入容器命令行
docker exec -it da40e6044522 bash
# 查看运行的程序,有nethello
top
Dockerfile文件优化
上面制作的镜像大小1.2GB,太大了,下面对Dockerfile进行优化。
Dockerfile简介
先简单介绍一下Dockerfile。
- Dockerfile 是一个文本文件,用于自动化构建 Docker 镜像的过程。它包含一系列指令,每个指令都告诉 Docker 如何构建镜像的各个层(layer)。这些指令可以包括设置基础镜像、安装依赖、拷贝文件、配置环境变量、暴露端口、运行命令等操作。
- 简单来说,Dockerfile 就是 Docker 镜像的构建说明书,类似于一个脚本,定义了镜像如何从头到尾构建和配置。
- 构建三步骤:编写Dockerfile文件–>docker build命令构建镜像–>docker run依镜像运行容器实例
Dockerfile概要
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数。
- 指令按照从上到下,顺序执行,类似脚本。
- #表示注释。
- 每条指令都会创建一个新的镜像层并对镜像进行提交。
DockerFile常用保留字指令
-
FROM:基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
-
MAINTAINER:镜像维护者的姓名和邮箱地址
-
RUN:容器构建时需要运行的命令是在 docker build时运行
-
EXPOSE:当前容器对外暴露出的端口
-
WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
-
USER:指定该镜像以什么样的用户去执行,如果都不指定,默认是root
-
ENV:用来在构建镜像过程中设置环境变量
-
ADD;将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
-
COPY:类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 的文件/目录复制到新的一层的镜像内的 位置
-
VOLUME:容器数据卷,用于数据保存和持久化工作
-
CMD:指定容器启动后的要干的事情
-
ENTRYPOINT:也是用来指定一个容器启动时要运行的命令类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖
-
FROM AS build:在 Docker 17.05 版本引入了多阶段构建(Multi-stage builds)的新特性,FROM as build 就是其中的一部分。多阶段构建允许我们在一个 Dockerfile 中定义多个 FROM 指令,每个指令代表一个构建阶段。这样可以使得镜像更加轻量,同时可以减少构建过程中的依赖。as build 中的 as 是一个别名,可以在后续步骤引用这个别名,方便在不同构建阶段之间传递文件等信息。
-
ARG:ARG指令用于定义可供Dockerfile使用的变量,这些变量在构建时可以传递。与环境变量不同,ARG变量在构建过程结束后不可用,并且在运行时无法访问。
-
ARCH:在一些多架构的场景中,ARCH变量特别重要。它可以帮助我们根据目标架构选择合适的基础镜像或软件下载版本。比如,我们可能需要为不同的硬件架构,如x86和ARM,构建不同的镜像。
Dockerfile优化
还是使用上面的例子,优化后的Dockerfile:
使用FROM AS多阶段构建,第一个FROM拷贝源码并编译,第二个FROM拷贝编译好的可执行文件,制作的docker镜像只包含可执行文件,不包含源码。
FROM ubuntu:20.04 AS build
EXPOSE 6025/tcp
EXPOSE 6025/udpRUN apt-get update && \DEBIAN_FRONTEND="noninteractive" \apt-get install -y --no-install-recommends \build-essential \cmake \vim \wget \gcc \g++ \gdb && \apt-get autoremove -y && \apt-get clean -y && \rm -rf /var/lib/apt/lists/*RUN mkdir -p /opt/workspace
COPY . /opt/workspace/nethello
WORKDIR /opt/workspace/nethelloRUN mkdir -p buildWORKDIR /opt/workspace/nethello/build
RUN cmake .. && make -j $(nproc)FROM ubuntu:20.04RUN apt-get update && \DEBIAN_FRONTEND="noninteractive" \apt-get install -y --no-install-recommends \build-essential \cmake \vim \wget \gcc \g++ \gdb && \apt-get autoremove -y && \apt-get clean -y && \rm -rf /var/lib/apt/lists/*RUN mkdir -p /opt/workspace/bin/WORKDIR /opt/workspace/bin/
COPY --from=build /opt/workspace/nethello/build /opt/workspace/bin/CMD ["./nethello","-s", "-p", "9090"]
制作过程中的错误解决,升级docker。
# Error parsing reference: "ubuntu:20.04 AS build" is not a valid repository/tag: invalid reference format
# Transaction check error: file /usr/bin/docker from install of docker-ce-cli# 升级docker版本
yum update
# 卸载旧版本(如果安装过旧版本的话)
yum remove docker docker-common docker-selinux docker-engine
# yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 由于repo中默认只开启stable仓库,故这里安装的是最新稳定版17.12.0
yum install docker-ce-17.12.0.ce
构建镜像
# 先拉取基础镜像
docker pull ubuntu:20.04
# 开始构建镜像
docker build -t nethello:v2 .
# 查看镜像
docker images
# 运行容器
docker run --name nethellov2 -p 9090:9090 -d nethello:v2
重新制作的镜像只有531MB,比原来的1.24GB小很多。
成功运行的容器。