1、Docker常用操作
Docker利用仓库管理镜像的设计与Git非常相似。我们要配置的应用运行环境就是镜像,如Tomcat镜像,当我们本地没有该镜像的时候,就需要从远程仓库pull下来,当我们启动这个镜像时,就会有一份镜像被复制并运行在容器中。如果我们改动了容器里面的内容,也可以将其commit保存成新的镜像。
(1)镜像命令
查看镜像:查看本地所有的镜像
docker images
docker images -q # 查看所用镜像的id
搜索镜像:从网络中查找需要的镜像
docker search 镜像名称
拉取镜像:从Docker仓库下载镜像到本地,镜像名称格式为“名称:版本号”,如果版本号不指定则是最新的版本。如果不知道镜像版本,可以去docker hub搜索对应镜像查看。
docker pull 镜像名称
删除镜像:删除本地镜像
docker rmi 镜像id # 删除指定本地镜像
docker rmi `docker images -q` # 删除所有本地镜像
(2)容器命令
创建并启动容器:
docker run 参数
参数说明:
-i:保持容器运行。通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用。
-d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。
-it 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器
--name:为创建的容器命名。
进入容器:
docker exec 参数 # 退出容器,容器不会关闭
查看容器的运行状态:
docker container ls查看当前有那些容器正在运行。
docker container ls -a查看所有容器,包括已退出的容器。
启动未运行容器:
docker start 容器名称
停止守护式容器:
docker stop 容器名称
删除容器:如果容器是运行状态则删除失败,需要停止容器才能删除
docker rm 容器名称
查看容器信息
docker inspect 容器名称
查看容器日志:
docker container logs命令只会输出最后几条日志并返回。更为推荐的方式是添加-f参数,用于监控容器的标准输出,功能类似于tail -f。
sudo docker container logs -f web
(3)主机和容器之间的文件拷贝
我们利用cp命令从主机将文件拷贝到容器中,或从容器拷贝文件都主机。
docker cp 主机路径 ID/NAME:容器路径 //这是从主机拷贝文件到容器
docker cp ID/NAME:容器路径 主机路径 //这是从容器拷贝文件到主机
2、部署MySQL
(1)获取MySQL8的镜像
在DockerHub中可以找到MySQL的最新版本是8.x。
1、搜索mysql镜像
docker search mysql
2、拉取mysql镜像
docker pull mysql
注意:默认就是最新版本。
(2)数据卷概述
数据卷是存在于一个或多个容器中的特定文件或文件夹,这个文件或文件夹以独立于docker文件系统的形式存在于宿主机中。
那么宿主机的任意目录都是数据卷吗?当然不是。这里还需要在容器中创建一个目录,然后将宿主机目录和容器目录绑定起来,这个宿主机目录才能成为数据卷。
当容器目录和数据卷目录绑定后,对方的修改会立即在二者之间同步。
一个数据卷可以被多个容器同时挂载。一个容器也可以被挂载多个数据卷。
(3)挂载主机目录
使用数据卷在多个容器之间可以非常方便地实现数据共享,但是在开发阶段需要频繁地修改文件,也就需要频繁地在本地文件和数据卷之间进行同步。Docker支持将本地目录挂载到容器中,这样修改宿主机中目录的内容,对容器来说是立即生效的。
Docker使用 --mount 或 -v 参数挂载本地主机的目录到容器中的目录。
注意:本地目录的路径必须是绝对路径。
--mount参数由多个键值对组成,以逗号分隔。
type选项:值为bind(默认)、volume或tmpfs。这里都是绑定装入,类型始终是bind。
source选项。对于绑定装入是Docker守护程序主机上的文件或目录的路径。
destination、dst或target选项:挂载到容器中的路径。
readonly选项:(如果存在)导致绑定装入以只读方式装入容器中。
-v和--mount之间的区别:
使用-v绑定宿主机上不存在的文件或者目录时,会自动生成相应的文件或者目录,--mount则会抛出异常,所以用--mount指定文件和路径时需要提前创建以保证其存在。
因为--mount支持集群,所以推荐使用--mount命令。
(4)创建MySQL容器(目录方式)
MySQL容器需要配置三个数据卷:配置文件、日志文件、数据文件。
mysql/data存放数据库文件。必须要挂载到容器外,否则容器重启一切数据都会消失。
mysql/log 是数据库主动生成的log。建议挂载到容器外。
mysql/config/my.cnf 是数据库的配置文件。
1、在宿主机中创建mysql目录,然后创建三个子目录:
mkdir -p /data/mysql
cd /data/mysql
mkdir conf data log 子目录conf保存配置,data保存数据,log保存日志
chmod 650 * -R 为docker访问宿主机目录授权(mysql不允许777权限)
cd /data/mysql/conf 进入目录创建配置文件
vi my.cnf 创建MySQL的配置文件,再使用 :wq 保存
其中,需提前在 /data/mysql/conf下创建my.cnf,并添加配置信息
# Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# The MySQL Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
lower-case-table-names=1
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
skip-name-resolve
# Custom config should go here
!includedir /etc/mysql/conf.d/
2、使用docker create命令来创建一个新的容器并运行
为容器绑定三个数据卷目录:配置目录、日志目录、数据目录
docker run -d \
--name mysql-3306 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /data/mysql/log:/var/log/mysql \
-v /etc/localtime:/etc/localtime:ro \
--restart always \
mysql --lower-case-table-names=1
参数说明:
-p 3306:3306:将容器的3306端口映射到宿主机的3306端口。
-v /data/mysql/conf/my.cnf:/etc/mysql/my.cnf:配置目录。
-v /data/mysql/log:/var/log/mysql:日志目录。
-v /data/mysql/data:/var/lib/mysql:数据目录。
-e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码。如果不设置则MySQL第一次运行时会生成一个默认密码,需要进入容器的控制台中查看。
-v /etc/localtime:/etc/localtime:ro 是让容器的时钟与宿主机时钟同步,避免时区的问题,ro是read only的意思,就是只读。
--lower-case-table-names=1 mysql8设置表名大小写不敏感(lower_case_table_names=1),默认是0,表名大小写敏感会严格区分大小写。
(6)使用客户端WorkBranch连接MySQL
1、MySQL8默认认证方式支持加密,只有MySQL8的WorkBranch可以连接。
注意:MySQL8默认不允许使用root账户远程登录,但是MySQL8的最新Docker镜像支持root账户远程登录。