Docker与Kvm的对比
kvm:
虚拟机
使用复杂
启动过程相对慢(分钟)
模版文件较大
和物理完全隔离
模拟的是一个完整系统,可以登录并实现管理
docker:
直接虚拟出来一个用户空间
使用简单
启动非常块(秒级)
模版文件很小
在一定程度上和物理机隔离
仅仅是模拟一部分用户空间,不方便管理
docker 底层技术
"namespaces" . "Union FS" . "Cgroup". "container format"
docker部署安装
第一步:需要下载阿里云较新版的docker源文件
[root@ken-node3 ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
第二步:移动文件到yum.repos.d下
[root@ken-node3 ~]# mv docker-ce.repo /etc/yum.repos.d/
第三步:下载docker-ce
docker-ce 社区免费版
docker-ee 企业收费版
[root@ken-node3 ~]# yum install docker-ce -y
第四步:直接启动docker并设置开机自启
[root@ken-node3 ~]# systemctl restart docker
[root@ken-node3 ~]# systemctl enable docker
注:
如果不启动docker服务会报如下的错误:
[root@ken-node3 ~]# docker image ls
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
第五步:验证docker服务是否可以正常运行
[root@ken1 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
镜像加速
为什么镜像加速?
因为docker在拉取镜像的时候是默认使用dockerhub上面的镜像即国外镜像,所以拉取速度是很慢的,
为了解决这个问题,我们就可以使用阿里云镜像加速
阿里云镜像加速
第一步:浏览器输入阿里云进入官网并登陆
略
第二步:进入控制台–》产品与服务–》容器镜像服务–》镜像加速器
第三步:创建一个脚本写入如下内容
略
一键部署安装docker并加速
#!/bin/bash
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
mv docker-ce.repo /etc/yum.repos.d
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker镜像操作相关的指令
docker使用技巧:
[root@ken-node3 ~]# docker –help #可以查看docker所有使用方法
[root@ken-node3 ~]# docker image –help #可以查看docker镜像操作的所有方法
[root@ken-node3 ~]# docker image ls –help #可以查看docker镜像操作中ls指令的用法
镜像操作指令:
build 从dockerfile中创建镜像
history 可以显示镜像的构建历史 #docker镜像分层构建,每一层都有一个指令
import 从一个压缩包创建镜像
save 创建镜像压缩包
load 从压缩包导入镜像
ls 列出来镜像
prune 清除不使用的镜像
pull 拉取镜像
push 推送镜像
rm 删除镜像
tag 改名
docker镜像操作演示
例子1:拉取镜像
格式:docker image pull REPOSITORY:TAG
[root@ken1 ~]# docker image pull busybox
注意:
如果在拉取镜像的时候只指定了REPOSITORY的话,默认拉取的是tag为latest的版本
例子2:查看当前有哪些镜像
[root@ken1 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox 1.31.0 db8ee88ad75f 3 weeks ago 1.22MB
busybox latest db8ee88ad75f 3 weeks ago 1.22MB
例子3:查看镜像构建历史
[root@ken1 ~]# docker image history busybox
IMAGE CREATED CREATED BY SIZE COMMENT
db8ee88ad75f 3 weeks ago /bin/sh -c #(nop) CMD ["sh"] 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ADD file:9ceca008111a4ddff… 1.22MB
例子4:制作镜像压缩包
方法一:使用-o选项,output
[root@ken1 ~]# docker image save busybox:1.31.0 -o busybox1.31.tar
[root@ken1 ~]# ls
anaconda-ks.cfg busybox1.31.tar docker-speend.sh test test1
方法二:使用标准输出
[root@ken1 ~]# docker image save busybox:1.31.0 > busybox1.31-v2.tar
[root@ken1 ~]# ls
anaconda-ks.cfg busybox1.31.tar busybox1.31-v2.tar docker-speend.sh test test1
例子5:使用镜像压缩包
方法一:使用-i,input
[root@ken-node3 ~]# docker image load -i busybox1.31.tar
Loaded image: busybox:1.31.0
[root@ken-node3 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox 1.31.0 db8ee88ad75f 3 weeks ago 1.22MB
方法二:
[root@ken-node3 ~]# docker image load < busybox1.31.tar
Loaded image: busybox:1.31.0
[root@ken-node3 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox 1.31.0 db8ee88ad75f 3 weeks ago 1.22MB
例子6:删除镜像
方法一:
[root@ken1 ~]# docker image rm busybox:1.31.0
Untagged: busybox:1.31.0
[root@ken1 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest db8ee88ad75f 3 weeks ago 1.22MB
方法二:
[root@ken1 ~]# docker rmi busybox
例子7:镜像改名
[root@ken1 ~]# docker image tag busybox:1.31.0 busybox:latest
[root@ken1 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox 1.31.0 db8ee88ad75f 3 weeks ago 1.22MB
busybox latest db8ee88ad75f 3 weeks ago 1.22MB
例子8:清除不经常使用的镜像
[root@ken1 ~]# docker image prune -f
Total reclaimed space: 0B
docker容器操作详解
run 运行容器
commit 使用当前运行的容器制作镜像
exec 可以在容器中执行命令或者进入容器
inspect 查看容器的详细信息,也可以查看镜像的信息
kill 强制杀掉容器
logs 查看容器产生的日志信息
ls 查看当前运行的容器
ps 查看当前运行的容器
pause 暂停容器
unpause 开启容器
port 查 看容器端口映射信息
rename 对容器改名
restart 重启容器
start 启动容器
stop 停掉容器
rm 删除容器,默认删除不了正在运行的容器,-f
stats 查看容器的运行状态
top 查看容器的系统内存,磁盘使用信息
例子1:启动容器
前台运行容器
[root@ken1 ~]# docker run -i -t busybox /bin/sh
-i 交互模式
-t分配终端
后台运行容器
[root@ken1 ~]# docker run -d nginx-game:v1
-d后台运行
例子2:查看正在运行的容器
[root@ken1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
95a695cffb03 nginx-game:v1 "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:88->80/tcp hardcore_shannon
查看正在运行以及已经退出的容器
[root@ken1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
95a695cffb03 nginx-game:v1 "nginx -g 'daemon of…" 3 minutes ago Up 3 minutes 0.0.0.0:88->80/tcp hardcore_shannon
40799b6b38f2 busybox "/bin/sh" 7 minutes ago Exited (0) 6 minutes ago infallible_benz
ac864729390b busybox "/bin/bash" 7 minutes ago Created elastic_swartz
adbc635a8bf1 busybox "ip a" 8 minutes ago Exited (0) 8 minutes ago nervous_noyce
例子3:删除一个容器
方法一:长ID
[root@ken1 ~]# docker rm 9105c43602d9
9105c43602d9
方法二:短ID
[root@ken1 ~]# docker rm 2c85ff7
2c85ff7
方法三:容器名
[root@ken1 ~]# docker rm youthful_kowalevski
youthful_kowalevski
注意:删除镜像一样!
例子4:后台运行容器
[root@ken1 ~]# docker run -d nginx-game:v1
72f712bff84eff8ad0b371291ff488d21f25aca69c2f08a1fd52dd2718d2158c
[root@ken1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
72f712bff84e nginx-game:v1 "nginx -g 'daemon of…" 4 seconds ago Up 3 seconds 80/tcp laughing_lovelace
例子5:运行容器加多个参数
[root@ken1 ~]# docker run --name nginxtest -d --rm nginx-game:v1
2cdec372f4350dea46b9fc6ce37d14314a4ef1351f2ec10da662aa36919b6bbe
[root@ken1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2cdec372f435 nginx-game:v1 "nginx -g 'daemon of…" 3 seconds ago Up 2 seconds 80/tcp nginxtest
–name 指定容器名字
-d 后台运行
–rm 容器停掉之后自动删除
例子6:批量删除容器
[root@ken1 ~]# docker rm $(docker ps -aq)
95a695cffb03
40799b6b38f2
ac864729390b
adbc635a8bf1
注意:
这样只能删除已经退出的容器,无法删除正在运行的容器
如果也想要删掉正在运行的容器,可以在docker rm 后加-f选项进行强制删除
例子7:查看容器信息
[root@ken1 ~]# docker inspect 72f712bff84e
注:
查看容器暴露的端口:
方法一:
docker history IMAGE_ID
方法二:
查看容器详细信息 docker inspect CONTAINER_ID
例子8:查看容器运行状态
[root@ken1 ~]# docker stats 72f712bff84e
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
72f712bff84e laughing_lovelace 0.00% 1.344MiB / 1.779GiB 0.07% 648B / 0B 0B / 0B 2
例子9:对容器内存使用量进行限制
[root@ken1 ~]# docker run -d -m 64M nginx-game:v1
-m选项指定容器可以使用的内存量
例子10:停止容器
[root@ken1 ~]# docker stop 8cd65493c7c1
8cd65493c7c1
[root@ken1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
72f712bff84e nginx-game:v1 "nginx -g 'daemon of…" 15 minutes ago Up 15 minutes 80/tcp laughing_lovelace
例子11:启动容器
[root@ken1 ~]# docker start 8cd65493c7c1
8cd65493c7c1
[root@ken1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8cd65493c7c1 nginx-game:v1 "nginx -g 'daemon of…" 2 minutes ago Up 1 second 80/tcp loving_sammet
72f712bff84e nginx-game:v1 "nginx -g 'daemon of…" 15 minutes ago Up 15 minutes 80/tcp laughing_lovelace
例子12:杀掉容器
[root@ken1 ~]# docker kill 8cd65493c7c1
8cd65493c7c1
[root@ken1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
72f712bff84e nginx-game:v1 "nginx -g 'daemon of…" 16 minutes ago Up 16 minutes 80/tcp laughing_lovelace
[root@ken1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8cd65493c7c1 nginx-game:v1 "nginx -g 'daemon of…" 2 minutes ago Exited (137) 6 seconds ago loving_sammet
72f712bff84e nginx-game:v1 "nginx -g 'daemon of…" 16 minutes ago Up 16 minutes 80/tcp laughing_lovelace
docker容器操作的kill和stop区别:
stop优雅退出。-15 10秒之后-9
kill -9
例子13:查看容器日志
[root@ken1 ~]# docker logs 8cd65493c7c1
持续刷新检测日志:
[root@ken1 ~]# docker logs 8cd65493c7c1 -f
-f 持续刷新
例子14:容器改名
[root@ken1 ~]# docker rename loving_sammet nginx-game
例子14:查看容器系统使用信息
[root@ken1 ~]# docker top nginx-game
UID PID PPID C STIME TTY TIME CMD
root 3054 3036 0 18:04 ? 00:00:00 nginx: master process nginx -g daemon off;
101 3088 3054 0 18:04 ? 00:00:00 nginx: worker process
例子15:暂停容器
[root@ken1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8cd65493c7c1 nginx-game:v1 "nginx -g 'daemon of…" 12 minutes ago Up 9 minutes (Paused) 80/tcp nginx-game
例子16:再开启容器
[root@ken1 ~]# docker unpause nginx-game
nginx-game
[root@ken1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8cd65493c7c1 nginx-game:v1 "nginx -g 'daemon of…" 13 minutes ago Up 9 minutes 80/tcp nginx-game
例子17:查看容器端口映射信息
[root@ken1 ~]# docker port 8cd65493c7c1
例子18:进入容器
[root@ken1 ~]# docker exec -it 8cd65493c7c1 sh
#
#
#
# exit
[root@ken1 ~]# docker exec -it 8cd65493c7c1 bash
root@8cd65493c7c1:/#
root@8cd65493c7c1:/#
root@8cd65493c7c1:/#
可以选择使用sh和bash进入容器
例子19:在容器外执行命令
[root@ken1 ~]# docker exec -it 95a695cffb03 ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
注意:
如果你要想操作容器的话,必须保证容器时up状态即正在运行的状态,exited状态的容器时无法进行操作的。
总结:进入容器的方式:4种进入容器的方法
方法一:exec #在容器里面退出,容器本身不会退出
方法二:attach #容器本身退出 exitd
方法三:ssh
方法四:nsenter
端口映射
实现了外部环境访问容器内部
四类端口映射:
第一类:把容器的端口随机映射为物理机的一个端口
第二类:把容器的端口映射为物理机特定的一个端口
第三类:把容器的端口映射为物理机特定网卡上的特定端口
第四类:把容器的端口映射为物理机特定网卡上的随机端口
第一类:把容器的端口随机映射为物理机的一个端口
使用的是大写的-P
[root@ken1 ~]# docker run -d -P httpd #随机映射为物理机的端口
cd662b604a59f6715b28c1af62956dbf665d5c4916897fbeb844e0e77ba8b99e
[root@ken1 ~]# docker ps #可以查看到容器映射信息
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd662b604a59 httpd "httpd-foreground" 12 seconds ago Up 11 seconds 0.0.0.0:32768->80/tcp happy_cray
50405dd6b651 httpd "httpd-foreground" 6 minutes ago Up 6 minutes 80/tcp busy_ardinghelli
72f712bff84e nginx-game:v1 "nginx -g 'daemon of…" About an hour ago Up About an hour 80/tcp laughing_lovelace
[root@ken1 ~]# ss -tnl #物理机启动会了相应的端口
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::32768 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
或者
[root@ken1 ~]# docker port cd662b604a59
80/tcp -> 0.0.0.0:32768
注意:
使用-P选线。是把容器内所有expose的端口都映射为物理机的随机端口
第二类:把容器端口映射为物理机特点端口
使用的是小写的-p
[root@ken1 ~]# docker run -d -p 80:80 httpd #使用小写p进行特定端口映射
15a01c693f4c4ffc0774bcb535fc5ec415aec9944f295ae9d468915b35019fae
[root@ken1 ~]# docker port 15a01c693f4c
80/tcp -> 0.0.0.0:80
[root@ken1 ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::32768 :::*
LISTEN 0 128 :::80 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
– p 80:80 第一个80是 物理机端口,第二个80是容器端口,顺序不能乱!另外物理机的端口不能被占用!
第三类:把容器端口映射为特点网卡上的随机端口
使用小写的p
[root@ken1 ~]# docker run -d -p 192.168.163.151::80 httpd
ba79a389a467f56c31a0f8489c39a35c756d56bd6a53486d4bee68b3103589bf
[root@ken1 ~]# docker port ba79a389a467f56c31a0f
80/tcp -> 192.168.163.151:32769
-p 192.168.163.151::80把容器的80端口随机映射为192.168.163.151上的一个随机端口
第四类:把容器端口映射为特点网卡上的特点端口
[root@ken1 ~]# docker run -d -p 192.168.163.151:81:80 httpd
64ce1f926979f66992a0377fabef5859b45d9466854649b457d741e3020257d6
[root@ken1 ~]# docker port 64ce1f926979f66
80/tcp -> 192.168.163.151:81
[root@ken1 ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 192.168.163.151:32769 *:*
LISTEN 0 128 192.168.163.151:81 *:*
-p 192.168.163.151:81:80 把容器80端口映射为192.168.163.151上的81端口
总结;
1.在端口映射中使用到了两个选项一个是大写的P,表示把容器暴露的端口随机映射为物理机上的一个随机端口,不能指定特定网卡
2.另外一个是小写的p,可以把容器暴露的端口映射为物理机特定的端口
3.或者映射为物理机特定网卡上的随机端口
4.或者特定网卡上的特定端口
阿里云镜像仓库
1,阿里云镜像仓库
2.dockerhub
3.registory私有镜像仓库
使用阿里云镜像仓库
第一步:注册登录
略
第二步:创建镜像仓库
第三步:命令行登录阿里云
[root@ken1 ~]# docker login --username=kenkendyg registry.cn-hangzhou.aliyuncs.com
Password: #是你注册的阿里云账号密码
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
第四步:改名
[root@ken1 ~]# docker tag nginx-com:v1 registry.cn-hangzhou.aliyuncs.com/kenken/nginx-com:v1
[root@ken1 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx-com v1 5de6e803346c 11 minutes ago 178MB
registry.cn-hangzhou.aliyuncs.com/kenken/nginx-com v1 5de6e803346c 11 minutes ago 178MB
第五步:推送
[root@ken1 ~]# docker push registry.cn-hangzhou.aliyuncs.com/kenken/nginx-com:v1
第六步:查看
阿里云镜像版本
第七步:拉取
[root@ken-node3 ~]# docker pull registry.cn-hangzhou.aliyuncs.com/kenken/nginx-com:v1
可以进行改名操作
第一步:首先查看相关镜像
[root@ken-node3 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx-com v1 5de6e803346c Less than a second ago 178MB
registry.cn-hangzhou.aliyuncs.com/kenken/nginx-com v1 5de6e803346c Less than a second ago 178MB
第二步:改名
[root@ken-node3 ~]# docker tag registry.cn-hangzhou.aliyuncs.com/kenken/nginx-com:v1 nginx-com:v1
第三步:删除相关镜像
[root@ken-node3 ~]# docker rmi registry.cn-hangzhou.aliyuncs.com/kenken/nginx-com:v1
镜像分类:
1,工具类的镜像(容器)
2,服务类的镜像(容器)
工具类镜像比如busybox,centos启动工具类镜像是使用交互模式docker run -it
服务类镜像比如nginx,redis,httpd启动服务类镜像使用的是docker -d
docker仓库
1.阿里云仓库
2.dockerhub仓库
3.私有仓库registry
1.dockerhub需要依赖外网网络,registry无需外网网络
2.dockerhub是公共仓库,任何人都可以进行拉取,registry私有仓库免费而且安全
搭建docker私有仓库registry
小心 latest tag
千万别被 latest tag 给误导了。latest 其实并没有什么特殊的含义。当没指明镜像 tag 时,Docker 会使用默认值 latest,仅此而已。
虽然 Docker Hub 上很多 repository 将 latest 作为最新稳定版本的别名,但这只是一种约定,而不是强制规定。
所以我们在使用镜像时最好还是避免使用 latest,明确指定某个 tag,比如 httpd:2.3,ubuntu:xenial。
第一步:拉取registry镜像
[root@ken1 ~]# docker search registry
[root@ken1 ~]# docker pull registry
第二步:查看registry镜像信息
[root@ken1 ~]# docker history registry
IMAGE CREATED CREATED BY SIZE COMMENT
f32a97de94e1 5 months ago /bin/sh -c #(nop) CMD ["/etc/docker/registr… 0B
<missing> 5 months ago /bin/sh -c #(nop) ENTRYPOINT ["/entrypoint.… 0B
<missing> 5 months ago /bin/sh -c #(nop) COPY file:507caa54f88c1f38… 155B
<missing> 5 months ago /bin/sh -c #(nop) EXPOSE 5000 0B
<missing> 5 months ago /bin/sh -c #(nop) VOLUME [/var/lib/registry] 0B
<missing> 5 months ago /bin/sh -c #(nop) COPY file:4544cc1555469403… 295B
<missing> 5 months ago /bin/sh -c #(nop) COPY file:21256ff7df5369f7… 20.1MB
<missing> 5 months ago /bin/sh -c set -ex && apk add --no-cache… 1.29MB
<missing> 5 months ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 5 months ago /bin/sh -c #(nop) ADD file:38bc6b51693b13d84… 4.41MB
搭建私有仓库需要和保存镜像的数据卷绑定
registry监听的是5000端口
打开registry容器
[root@ken1 ~]# docker run -d -p 5000:5000 -v /tes:/var/lib/registry registry:2
第三步:使用registry
[root@ken1 ~]# docker tag busybox 192.168.64.8:5000/busbox:v1
[root@ken1 ~]# docker push 192.168.64.8:5000/busbox:v1
The push refers to repository [192.168.64.8:5000/busbox]
Get https://192.168.64.8:5000/v2/: http: server gave HTTP response to HTTPS client
想要使用registry私有仓库,需要首先把镜像名改为host:port/镜像名:tag
但是现在直接推得话会报上面的错误
第四步:解决上述错误
在docker文件添如下一行
[root@ken1 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://xxx.mirror.aliyuncs.com"],
"insecure-registries":["192.168.64.8:5000"]
}
ip地址指定的是registry所在的宿主机的IP地址
5000端口是registry仓库映射到宿主机的端口,建议就映射为特定的5000端口
第五步:重启docker和容器
[root@ken1 ~]# systemctl restart docker
[root@ken1 ~]# docker start d8681dfb9854
第六步:再次推送
[root@ken1 ~]# docker push 192.168.64.8:5000/busbox:v1
第七步:查看仓库
[root@ken1 ~]# ls /test/docker/registry/v2/repositories/busbox/
其他人如何使用私有仓库?
第一步:也需要添加一行
"insecure-registries":["192.168.64.8:5000"]
第二步:重启docker
略
第三步:拉取镜像
[root@ken1 ~]# docker pull 192.168.64.8:5000/busbox:v1
总结如何实现共享镜像?
1.把镜像制作成tar包,然后进行镜像共享
2.把镜像传到阿里云或者dockerhub仓库进行镜像共享harbor
3.把镜像传到公司内部私有镜像仓库,实现镜像共享
docker使用数据库实现数据持久化演示
第一步:搜索数据库镜像并下载相应的数据库镜像
[root@localhost ~]# docker search mysql
第二步:启动数据库
[root@localhost ~]# docker run -d -v /ken:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 --name mysql1 mysql
-e 指定设置环境变量。MYSQL_ROOT_PASSWORD指定数据库登录的初始密码
第三步:访问数据库
[root@localhost ~]# docker run -it mysql mysql -uroot -p123 -h172.17.0.2
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.11 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
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> create database ken;
Query OK, 1 row affected (0.22 sec)
第四步:销毁容器并验证数据持久化
[root@localhost ~]# docker run -d -v /ken:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 mysql
d9655ecf33e7b8f11fb231e9b0a398f61d48268c084ef184e110fced55491364
[root@localhost ~]# docker exec -it d9655ecf33e7b8f11fb23 bash
root@d9655ecf33e7:/# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
root@d9655ecf33e7:/# mysql -uroot -p123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.11 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
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 |
| ken |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)
mysql>
两个容器之间建立连接
[root@localhost ~]# docker run -it --link flamboyant_gauss:mysql mysql mysql -uroot -p123 -hmysql
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.11 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
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>
--link flamboyant_gauss:mysql
格式:容器名:别名