Docker学习笔记(一)--基础篇

1. 安装

官方安装地址文档

使用该命令先卸载原来可能安装的docker

sudo apt-get remove docker docker-engine docker.io containerd runc

1.1 使用官方安装脚本自动安装 (仅适用于公网环境)

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

1.2手动安装帮助 (阿里云ECS可以通过内网安装,见注释部分内容)

Ubuntu 14.04 16.04 (使用apt-get进行安装)
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce

注意:其他注意事项在下面的注释中
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
#   docker-ce | 17.03.1~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
#   docker-ce | 17.03.0~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]

# 通过经典网络、VPC网络内网安装时,用以下命令替换Step 2、Step 3中的命令
# 经典网络:
# curl -fsSL http://mirrors.aliyuncs.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyuncs.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# VPC网络:
# curl -fsSL http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# sudo add-apt-repository "deb [arch=amd64] http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
CentOS 7 (使用yum进行安装)
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

注意:其他注意事项在下面的注释中
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,你可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
#   将 [docker-ce-test] 下方的 enabled=0 修改为 enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
#   Loading mirror speeds from cached hostfile
#   Loaded plugins: branch, fastestmirror, langpacks
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
#   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
#   Available Packages
# Step2 : 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
# 注意:在某些版本之后,docker-ce安装出现了其他依赖包,如果安装失败的话请关注错误信息。例如 docker-ce 17.03 之后,需要先安装 docker-ce-selinux。
# yum list docker-ce-selinux- --showduplicates | sort -r
# sudo yum -y install docker-ce-selinux-[VERSION]

# 通过经典网络、VPC网络内网安装时,用以下命令替换Step 2中的命令
# 经典网络:
# sudo yum-config-manager --add-repo http://mirrors.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo
# VPC网络:
# sudo yum-config-manager --add-repo http://mirrors.could.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo

阿里云镜像加速


2.常用命令

1.帮助启动类

启动docker:syatemctl start docker
停止docker:systemctl spot docker
重启docker:systemctl restart docker
查看docker状态:systemctl status docker
开机启动:systemctl enable docker
查看docker概要信息:docker info
查看docker的总帮助文档:docker --help
查看docker的命令帮组文档:docker 具体命令 --help

2.镜像命令

列出本地主机上的镜像:docker images
-a (列出本地的所有镜像(含有历史镜像层))
-q (只显示镜像id)

查看远程仓库是否存在某个镜像:docker search [OPTIONS] 镜像名字
–limit N (只列出前N个镜像)
例: docker search --limit 5 redis

下载镜像:docker pull 镜像名字[:TAG(镜像的标签版本号)] 例: docker pull redis:6.0.8 查看镜像/容器/数据卷所占用的空间:docker system df 删除镜像:docker rmi 镜像名字ID docker rmi -f 镜像ID (删除单个) docker rmi -f 镜像名1 镜像名2 ... (删除多个) docker rmi -f $(docker images -qs) (删除全部 注:**很危险!!**) 面试题:谈谈docker的虚悬镜像是什么? 仓库名、镜像名都是\的镜像俗称虚悬镜像

3.容器命令

先创建一个Ubuntu的镜像

新建+启动容器:docker run [OPTIONS] IMAGE [COMMANGE] [ARG…]

OPTIONS说明:有些是一个减号,有些是连个减号

–name=“新名字” :为容器指定一个名称

-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);

-i:以交互模式运行容器,通常与 -t 同时使用;

-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;也即启动交互式容器(前台有伪终端,等待交互);

-P: 随机端口映射,大写P

-p: 指定端口映射,小写p

前台交互式启动例如:docker run -it redis:6.0.8

后台守护式启动例如:docker run -t redis:6.0.8

列出当前所有正在运行的容器:docker ps [OPTIONS]

-a:列出当前所有正在运行的容器+历史上运行过的

-l:显示最近创建的容器

-n 数字:显示最近创建的(数字)个镜像

-q:静默模式,只显示容器编号

退出容器

exit:run进去容器,exit退出,容器停止

ctrl+p+q:run进去容器,ctrl+p+q退出,容器不会停止

启动已经停止的容器

docker start 容器id或容器名

重启容器

docker restart 容器id或容器名

停止容器

docker stop 容器id或容器名

强制停止容器

docker kill 容器id或容器名

删除已经停止的容器

docker rm 容器id

一次性删除多个容器实例(危险!!)

docker rm -f $(docker ps -a -q)

docker ps -a -q | xages docker rm

重要:

启动守护式容器(后台服务器)

在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的后台运行模式。

docker run -d 容器名

使用镜像centos:latest以后台模式启动一个容器

docker run -d centos

问题:然后docker ps -a 进行查看, 会发现容器已经退出

很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程.

容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。

这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,

我们配置启动服务只需要启动响应的service即可。

例如service nginx start

但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,

这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.

所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行,

常见就是命令行模式,表示我还有交互操作,别中断,O(∩_∩)O哈哈~

redis 前后台启动演示case

前台交互式启动例如:docker run -it redis:6.0.8

后台守护式启动例如:docker run -t redis:6.0.8

查看容器日志

docker logs 容器id

查看容器内运行的进程

docker top 容器id

查看容器内部细节

docker inspect 容器id

进入正在运行的容器并以命令交互

docker exec -it 容器ID bashShell

docker attach 容器ID

区别:attach 直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止。

​ exec 是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止。

推荐大家使用 docker exec 命令,因为退出容器终端,不会导致容器的停止。

例如:docker exec -it redis /bin/bash

从容器内拷贝文件到主机上

容器 -> 主机

docker cp 容器ID:容器内地址 目的主机地址

导入和导出容器

export 导出容器的内容留作为一个tar归档文件[对应import命令]

import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]

案例:

docker export 容器ID > 文件名.tar

在这里插入图片描述
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
在这里插入图片描述

4.总结

attach    Attach to a running container                 # 当前 shell 下 attach 连接指定运行镜像

build     Build an image from a Dockerfile              # 通过 Dockerfile 定制镜像

commit    Create a new image from a container changes   # 提交当前容器为新的镜像

cp        Copy files/folders from the containers filesystem to the host path   #从容器中拷贝指定文件或者目录到宿主机中

create    Create a new container                        # 创建一个新的容器,同 run,但不启动容器

diff      Inspect changes on a container's filesystem   # 查看 docker 容器变化

events    Get real time events from the server          # 从 docker 服务获取容器实时事件

exec      Run a command in an existing container        # 在已存在的容器上运行命令

export    Stream the contents of a container as a tar archive   # 导出容器的内容流作为一个 tar 归档文件[对应 import ]

history   Show the history of an image                  # 展示一个镜像形成历史

images    List images                                   # 列出系统当前镜像

import    Create a new filesystem image from the contents of a tarball # 从tar包中的内容创建一个新的文件系统映像[对应export]

info      Display system-wide information               # 显示系统相关信息

inspect   Return low-level information on a container   # 查看容器详细信息

kill      Kill a running container                      # kill 指定 docker 容器

load      Load an image from a tar archive              # 从一个 tar 包中加载一个镜像[对应 save]

login     Register or Login to the docker registry server    # 注册或者登陆一个 docker 源服务器

logout    Log out from a Docker registry server          # 从当前 Docker registry 退出

logs      Fetch the logs of a container                 # 输出当前容器日志信息

port      Lookup the public-facing port which is NAT-ed to PRIVATE_PORT    # 查看映射端口对应的容器内部源端口

pause     Pause all processes within a container        # 暂停容器

ps        List containers                               # 列出容器列表

pull      Pull an image or a repository from the docker registry server   # 从docker镜像源服务器拉取指定镜像或者库镜像

push      Push an image or a repository to the docker registry server    # 推送指定镜像或者库镜像至docker源服务器

restart   Restart a running container                   # 重启运行的容器

rm        Remove one or more containers                 # 移除一个或者多个容器

rmi       Remove one or more images       # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]

run       Run a command in a new container              # 创建一个新的容器并运行一个命令

save      Save an image to a tar archive                # 保存一个镜像为一个 tar 包[对应 load]

search    Search for an image on the Docker Hub         # 在 docker hub 中搜索镜像

start     Start a stopped containers                    # 启动容器

stop      Stop a running containers                     # 停止容器

tag       Tag an image into a repository                # 给源中镜像打标签

top       Lookup the running processes of a container   # 查看容器中运行的进程信息

unpause   Unpause a paused container                    # 取消暂停容器

version   Show the docker version information           # 查看 docker 版本号

wait      Block until a container stops, then print its exit code   # 截取容器停止时的退出状态值

3.docker镜像

3.1 是什么

是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。
只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。

3.1.1 分层的下载

以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载

3.1.2 UnionFS(联合文件系统)

Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

3.1.3 Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M?

对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。

3.2 重点理解

Docker镜像层都是只读的,容器层是可写的

当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

3.3 镜像Commit操作案例

docker commit提交容器副本使之成为一个新的镜像

docker commit -m=“提交的描述信息” -a=“作者” 容器ID要创建的目标镜像名:[标签名]

案例:Ubuntu安装vim

apt-get update
先更新我们的包管理工具
apt-get -y install vim
安装我们需要的vim

commit我们的新镜像

docker commit -m="add vim cmd" -a="xxx" d96edeabd6b6 xxx/myubun:1.3

4.本地镜像发布到阿里云


4.1 先创建一个命名空间

阿里云登录->工作台->菜单中找到容器镜像服务->实例列表->个人实例->命名空间->创建命名空间

4.2 创建创库名称

镜像仓库-> 创建镜像仓库

4.3 进入管理界面获得脚本


5.本地镜像发布到私有库

5.1 下载镜像Docker Registry

5.2 运行私有库Registry,相当于本地私有Docker hub

docker run -d -p 5000:5000 -v /xxx/myregistry/:/tmp/registry --privileged=true registry

5.3 案例演示,创建一个新镜像,Ubuntu安装ifconfig命令

docker commit -m="add ifconfig" -a="xxx" ac7a7a71e7ce myubun:1.4

5.4 安装完成后,commit我们的新镜像

docker commit -m="add ifconfig" -a="xxx" ac7a7a71e7ce myubun:1.4

5.5 curl验证私服上有什么镜像

[root@centos01 xxx]# curl -XGET http://192.168.75.130:5000/v2/_catalog
{"repositories":[]}

5.6 将新镜像修改为符合私服规范的Tag

按照公式: docker tag 镜像:Tag Host:Port/Repository:Tag

[root@centos01 xxx]# docker tag myubun:1.4 192.168.75.130:5000/myubun:1.4

5.7 修改配置文件使之私服可以支持http

修改前
[root@centos01 xxx]# cat /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://y9uvrs7a.mirror.aliyuncs.com"]
}
修改后
[root@centos01 xxx]# cat /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://y9uvrs7a.mirror.aliyuncs.com"],
  "insecure-registries": ["192.168.75.130:5000"]
}

[root@centos01 xxx]# docker push 192.168.75.130:5000/myubun:1.4
The push refers to repository [192.168.75.130:5000/myubun]
64cdb6d21c1d: Pushed 
9f54eef41275: Pushed 
1.4: digest: sha256:55517657f747fd9b725660b024ccbe98fd83045c1e4600e5f43d030b97fe0dbd size: 741

5.8 curl验证私服上有什么镜像

[root@centos01 xxx]# curl -XGET http://192.168.75.130:5000/v2/_catalog
{"repositories":["myubun"]}

5.9 pull到本地并运行

[root@centos01 xxx]# docker pull 192.168.75.130:5000/myubun:1.4
1.4: Pulling from myubun
7b1a6ab2e44d: Already exists 
c1573538fb63: Already exists 
Digest: sha256:55517657f747fd9b725660b024ccbe98fd83045c1e4600e5f43d030b97fe0dbd
Status: Downloaded newer image for 192.168.75.130:5000/myubun:1.4
192.168.75.130:5000/myubun:1.4

6.docker容器数据卷

6.1 容器卷记得加入

Docker挂载主机目录访问如果出现cannot open directory .: Permission denied

解决办法:在挂载目录后多加一个–privileged=true参数即可

如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,

在SELinux里面挂载目录被禁止掉了额,如果要开启,我们一般使用–privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即

使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。

6.2 是什么

有点类似我们Redis里面的rdb和aof文件

将docker容器内的数据保存进宿主机的磁盘中

运行一个带有容器卷存储功能的容器实例

docker run -it --privileged=true  -v /宿主机绝对路径目录:/容器内目录 镜像名

6.3 实例

[root@centos01 xxx]# docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=u1 ubuntu
root@dbc00e41c624:/# cd tmp
root@dbc00e41c624:/tmp# ls
docker_data
root@dbc00e41c624:/tmp# cd docker_data
root@dbc00e41c624:/tmp/docker_data# ls
root@dbc00e41c624:/tmp/docker_data# touch dockerin.txt
bash: cd: tmp: 没有那个文件或目录
[root@centos01 xxx]# cd /tmp
[root@centos01 tmp]# cd host_data
[root@centos01 host_data]# ls
dockerin.txt
主机
[root@centos01 host_data]# touch host.txt
[root@centos01 host_data]# ls
dockerin.txt  host.txt
[root@centos01 host_data]# echo 'hello docker ' > host.txt
容器
root@dbc00e41c624:/tmp/docker_data# ls
dockerin.txt  host.txt
root@dbc00e41c624:/tmp/docker_data# vi host.txt
bash: vi: command not found
root@dbc00e41c624:/tmp/docker_data# cat host.txt
hello docker 

此时使用 docker inspect 容器ID 可以看到

"Mounts": [
  {
       "Type": "bind",
           "Source": "/tmp/host_data",
           "Destination": "/tmp/docker_data",
           "Mode": "",
           "RW": true,
           "Propagation": "rprivate"
       }
   ],

docker容器stop,主机修改,docker容器重启看数据是否同步。

6.4 读写规则映射添加说明

默认是可读可写的

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名

容器内部被限制,只能读不能写

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

[root@centos01 host_data]# docker run -it --privileged=true -v /mydocker/u:/tmp/u:ro --name=u2 ubuntu
root@e632e917439c:/# cd /tmp
root@e632e917439c:/tmp# ls
root@e632e917439c:/tmp/u# touch a.txt
touch: cannot touch 'a.txt': Read-only file system
root@e632e917439c:/tmp/u# ls
b.txt

[root@centos01 u]# touch b.txt

6.5 卷的继承和共享

容器1完成和宿主机之间的映射

主机
[root@centos01 u]# rm -rf b.txt 
[root@centos01 u]# ls
[root@centos01 u]# touch u1ubuntu.txt
[root@centos01 u]# ls
u1ubuntu.txt
[root@centos01 u]# ls
host.txt  u1ubuntu.txt

容器1
[root@centos01 xxx]# docker run -it --privileged=true -v /mydocker/u:/tmp/u --name=u1 ubuntu
root@7099922c768b:/# cd /tmp/u
root@7099922c768b:/tmp/u# ls
u1ubuntu.txt
root@7099922c768b:/tmp/u# touch host.txt
root@7099922c768b:/tmp/u# ls
host.txt  u1ubuntu.txt

容器2继承容器1的卷规则

docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu

容器2
[root@centos01 xxx]# docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu
root@d6b977f1604f:/# cd /tmp/u
root@d6b977f1604f:/tmp/u# ls
host.txt  u1ubuntu.txt
root@d6b977f1604f:/tmp/u# touch u2.txt
root@d6b977f1604f:/tmp/u# ls
host.txt  u1ubuntu.txt  u2.txt
root@d6b977f1604f:/tmp/u# ls
h1.txt  host.txt  u1ubuntu.txt  u2.txt

容器1
root@7099922c768b:/tmp/u# ls
host.txt  u1ubuntu.txt  u2.txt
root@7099922c768b:/tmp/u# [root@centos01 xxx]# 
[root@centos01 xxx]# docker exec -it 7099922c768b /bin/bash
root@7099922c768b:/# cd /tmp/u
root@7099922c768b:/tmp/u# ls
h1.txt  host.txt  u1ubuntu.txt  u2.txt

主机
[root@centos01 u]# ls
host.txt  u1ubuntu.txt  u2.txt
[root@centos01 u]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
d6b977f1604f   ubuntu    "bash"    45 minutes ago   Up 15 minutes             u2
7099922c768b   ubuntu    "bash"    54 minutes ago   Up 14 minutes             u1
[root@centos01 u]# docker stop 7099922c768b
7099922c768b
[root@centos01 u]# touch h1.txt
[root@centos01 u]# ls
h1.txt  host.txt  u1ubuntu.txt  u2.txt
[root@centos01 u]# docker start 7099922c768b
7099922c768b

7.Docker常见软件安装

7.1 总体步骤

1.搜索镜像

2.拉取镜像

3.查看镜像

4.启动镜像

5.停止镜像

6.移除镜像

7.2 安装Tomcat

  1. docker hub上面查找tomcat镜像
docker search tomcat
  1. 从docker hub上拉取tomcat镜像到本地
docker pull tomcat
  1. docker images查看是否有拉取到的tomcat

  2. 使用tomcat镜像创建容器实例(也叫运行镜像)

    问题:出现404:
    解决:1.可能没有关闭防火墙
    	 2.把webapps.dist目录换成webapps
    
  3. 访问tomcat首页

  4. 免修改版

    安装tomcat8
    docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
    

7.3 安装Mysql

7.3.1 简单版(会产生的问题)
  1. docker hub上面查找mysql镜像
  2. 从docker hub上(阿里云加速器)拉取mysql镜像到本地标签为5.7
  3. 使用mysql5.7镜像创建容器(也叫运行镜像)
[root@centos01 u]# docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
[root@centos01 u]# docker exec -it 248d2cd84e37 /bin/bash
root@248d2cd84e37:/# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.36 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> create database db01;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db01               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

mysql> use db01
Database changed
mysql> create table t1(id int,name varchar(12));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t1 values(1,"zhangsan");
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
+------+----------+
1 row in set (0.00 sec)
  1. win连接Mysql
  2. 问题
1. 为什么插入中文会报错?
docker上默认字符集的问题

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)

2. 删除容器后,mysql里的数据怎么办?

7.3.2 实战版
  1. 创建Mysql容器实例
完整命令(执行)docker run -d -p 3306:3306 --privileged=true -v /mydocker/mysql/log:/var/log/mysql -v /mydocker/mysql/data:/var/lib/mysql -v /mydocker/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7

整理命令(分析)docker run -d -p 3306:3306 --privileged=true #开启权限
-v /mydocker/mysql/log:/var/log/mysql #添加容器卷
-v /mydocker/mysql/data:/var/lib/mysql
-v /mydocker/mysql/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=123456 #设置密码
--name mysql #设置名称
mysql:5.7 #镜像名
  1. 新建my.cnf

通过容器卷同步给mysql容器实例

[root@centos01 /]# cd /mydocker/mysql/conf
[root@centos01 conf]# ls -l
总用量 0
[root@centos01 conf]# vi my.cnf

添加以下配置后,保存退出:
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
  1. 重启mysql容器实例
[root@centos01 conf]# docker restart mysql
mysql
[root@centos01 conf]# docker exec -it mysql /bin/bash
root@5e25fabd39ab:/# mysql -uroot -p
Enter password: 
...
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> create database db01;
Query OK, 1 row affected (0.00 sec)

mysql> use db01;
Database changed
mysql> create table t1(id int,name varchar(12));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t1 values(1,'zhangsan');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | 王五     |
+------+----------+
2 rows in set (0.00 sec)
  1. 结论

之前的DB 无效

修改字符集操作+重启mysql容器实例

之后的DB 有效,需要新建

结论:docker安装完MySQL并run出容器后,建议请先修改完字符集编码后再新建mysql库-表-插数据

  1. 测试

测试直接删除mysql容器,重新启动一个mysql容器,查看数据是否还存在

[root@centos01 xxx]# docker rm -f mysql
mysql
[root@centos01 xxx]# docker run -d -p 3306:3306 --privileged=true -v /mydocker/mysql/log:/var/log/mysql -v /mydocker/mysql/data:/var/lib/mysql -v /mydocker/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
d8a67c31b8692489f0590266d0d1e6114598771abd0138613324853f1c07d378
[root@centos01 xxx]# docker exec -it mysql /bin/bash
root@d8a67c31b869:/# mysql -uroot -p
Enter password: 
...
mysql> use db01;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from t1;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | 王五     |
+------+----------+
2 rows in set (0.00 sec)

7.4 安装Redis

  1. 从docker hub上(阿里云加速器)拉取redis镜像到本地
  2. 在宿主机下创建 /app/redis目录
  3. 在/app/redis目录下创建redis.conf文件并修改

3.1 开启redis验证 可选

例如: requirepass 123

3.2 允许redis外地连接 必须

注释掉 # bind 127.0.0.1

在这里插入图片描述

3.3 daemonize no

将daemonize yes注释起来或者 daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败

在这里插入图片描述
3.4 开启redis数据持久化 appendonly yes 可选

  1. 使用镜像创建容器
docker run -p 6379:6379 --name redis --privileged=true
-v /app/redis/redis.conf:/etc/redis/redis.conf
-v /app/redis/data:/data
-d redis redis-server /etc/redis/redis.conf #读取我们修改好的配置

完整命令:
docker run -p 6379:6379 --name redis --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis redis-server /etc/redis/redis.conf 
[root@centos01 redis]# docker run -p 6379:6379 --name redis --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis redis-server /etc/redis/redis.conf 
ed11411e3cddd564ce2c65b28782aa22bcdd564e5bd4712ec7f08566f6d10a5b
[root@centos01 redis]# docker exec -it redis /bin/bash
root@ed11411e3cdd:/data# redis-cli
127.0.0.1:6379> set k1 v1
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> set k1 v1
OK
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值