实战:安装MySQL
#获取镜像
[root@localhost /]# docker pull mysql:5.7
#运行容器,需要做数据挂载!安装启动mysql,需要配置密码,这个要注意!
#官方测试: docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#启动
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
[root@localhost /]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql mysql:5.7
#启动成功之后,我们在本地使用sqlyog来连接测试一下
#sqlyog 连接到服务器的3306,和容器内的3306映射。
具名挂载和匿名挂载
#匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /ect/ngnix ngnix
#查看所有volume 的情况
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local 2a49d83f8dc7aa53bed600410117014b3be8df5ff887208d1987ed94836b4769
#这里发现,这种就是匿名挂载,我们在-v只写了容器内的路径,没有容器外的路径!
#具名挂载
[root@localhost ~]# docker run -d -P --name nginx02 -v hnbc-nginx:/etc/nginx nginx
3e74e4961075ed67390ac1096ab8b54b65f889fd858e0d705791587facf9b5a1
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local hnbc-nginx
#通过 -v 卷名:容器内路径
#查看一下这个路径
docker volume inspect ray-nginx
所有的docker容器内的卷,没有指定目录的情况下都是在``/var/lib/docker/volumes/xxx`
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的具名挂载
#如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径 #匿名挂载
-V 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
拓展
#通过 -v 容器内路径:ro rw 改变读写权限
ro readonly #只读
rw readwrite #可读可写
#一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定!
docker run -d -P --name nginx02 -v hnbc-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v hnbc-nginx:/etc/nginx:rw nginx
#ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内是无法操作的!
DockerFile
DockerFile介绍
Dockerfile 就是用来构建docker镜像的构造文件!命令脚本!
构建步骤:
1、编写一个dockerfile文件
2、docker build构建成为一个镜像
3、docker run 运行镜像
4、docker ps发布镜像(DockerHub、阿里云镜像仓库)
DockerFile构建过程
基础知识:
1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序执行
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!
dockerfile是面向开发的 ,以后要发布项目做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成为了一个企业的交付标准,必须要掌握!
步骤:开发、部署、运维。
Dockerfile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的,最终发布和运行的产品!
Docker容器:容器就是镜像运行起来提供服务器
DockerFile的指令
FROM #基础镜像,一切从这里开始
MAINTAINER #镜像是谁写的,姓名+邮件
RUN #镜像构建的时候需要运行的命令
ADD #步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOSE #保留端口的位置
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承 DockerFile这个时候就会运行ONBUILD 的指令。触发指令
COPY #类似于ADD,将我们的文件拷贝到镜像中
ENV #构建的时候设置环境变量
实战测试
DockerHub中99%镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建
#1、编写Dockerfile的文件
[root@localhost dockerfile]# cat docker-centos
FROM centos
MAINTAINER ray<2281876969@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
Run yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
#2、通过这个文件构建镜像
#命令dcoker build -f dockerfile文件路径 -t 镜像名:[tag]
Successfully built 00213d1ecd7b
Successfully tagged mycentos:0.1
#3、测试运行
列出本地进行变更历史可以研究它是怎么做的。
CMD和ENTRYPOINT区别
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追求命令
#编写一个dockerfile文件
[root@localhost dockerfile]# vi docker-cmd-test
FROM centos
CMD ["ls","-a"]
#构建镜像
[root@localhost dockerfile]# docker build -f docker-cmd-test -t dockercmd .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM centos
---> 5d0da3dc9764
Step 2/2 : CMD ["ls","-a"]
---> Running in 7597ecb2674a
Removing intermediate container 7597ecb2674a
---> b99e19cec11d
Successfully built b99e19cec11d
Successfully tagged dockercmd:latest
#run运行发现我们的ls -a命令生效
[root@localhost dockerfile]# docker run b99e19cec11d
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
#想追加一个命令 -l ls -al
[root@localhost dockerfile]# docker run b99e19cec11d -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
#cmd清理下 -l 替换了CMD["ls","a"]命令,-l不是命令所以报错!
测试 ENTRYPOINT
[root@localhost dockerfile]# vi docker-cmd-entrypoint
[root@localhost dockerfile]# docker build -f docker-cmd-entrypoint -t docker-entrtpoint .
Sending build context to Docker daemon 4.096kB
Step 1/2 : FROM centos
---> 5d0da3dc9764
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in 540ed15751d7
Removing intermediate container 540ed15751d7
---> 91a2b66a37ee
Successfully built 91a2b66a37ee
Successfully tagged docker-entrtpoint:latest
[root@localhost dockerfile]# docker run 91a2b66a37ee
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
#我们的追加命令,是直接拼接在我们ENTRYPOINT命令的后面!
[root@localhost dockerfile]# docker run 91a2b66a37ee -l
total 0
drwxr-xr-x. 1 root root 6 Jan 20 15:15 .
drwxr-xr-x. 1 root root 6 Jan 20 15:15 ..
-rwxr-xr-x. 1 root root 0 Jan 20 15:15 .dockerenv
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Jan 20 15:15 dev
drwxr-xr-x. 1 root root 66 Jan 20 15:15 etc
drwxr-xr-x. 2 root root 6 Nov 3 2020 home
lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------. 2 root root 6 Sep 15 14:17 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 2020 media
drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x. 128 root root 0 Jan 20 15:15 proc
dr-xr-x---. 2 root root 162 Sep 15 14:17 root
drwxr-xr-x. 11 root root 163 Sep 15 14:17 run
lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x. 13 root root 0 Jan 20 14:13 sys
drwxrwxrwt. 7 root root 171 Sep 15 14:17 tmp
drwxr-xr-x. 12 root root 144 Sep 15 14:17 usr
drwxr-xr-x. 20 root root 262 Sep 15 14:17 var
[root@localhost dockerfile]#
DockerFile中很多命令都十分的相似,我们需要了解它们的区别,我们最好的学习就是对比它们,然后测试!
实战:tomcat镜像
2、编写dockerfile文件,官方命名 Dockerfile
, build会自动寻找这个文件,就不需要-f指定了!
FROM centos
MAINTAINER lym<2281876969@qq.com>
ADD apache-tomcat-8.5.75.tar.gz /usr/local/
ADD jdk-8u321-linux-aarch64.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_321
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.75
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.75
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.75/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.75/logs/catalina.out
3、构建镜像
docker build -t diytomcat .
4、运行镜像
[root@localhost tomcat]# docker run -d -p 9090:8080 --name lymtomcat -v /home/lym/build/tomcat/app:/usr/local/apache-tomcat-8.5.75/webapps/app -v /home/lym/build/tomcat/logs:/usr/local/apache-tomcat-8.5.75/logs diytomcat
5、访问测试
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Dockerfile</title>
</head>
<body>
<h1>HellO Dockerfile!</h1>
<p>
Welcome Dockerfile!
</p>
</body>
</html>
访问项目
我们以后开发的步骤:需要Dockerfile的编写!我们之后都是使用docke镜像来发布运行!
发布自己的镜像
DockerHub
1、地址https://hub.docker.com/,注册自己的账号!
2、确定这个账号可以登陆
3、在我们服务上提交自己的镜像
[root@localhost app]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
4、登陆完毕后就可以提交镜像了,就是一步,docker push
[root@localhost app]# docker login -u lym7951
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
#push自己的镜像到服务器
[root@localhost tomcat]# docker push diytomcat
Using default tag: latest
The push refers to repository [docker.io/library/diytomcat]
f1cccb8234dc: Preparing
f4fefa1eec06: Preparing
18e7bf733333: Preparing
74ddd0ec08fa: Preparing
denied: requested access to the resource is denied #拒绝
#push 镜像的问题?
root@localhost tomcat]# docker push lym/diytomcat:1.0
The push refers to repository [docker.io/lym/diytomcat]
An image does not exist locally with the tag: lym/diytomcat
#解决,增加一个tag
[root@localhost tomcat]# docker tag b99e19cec11d lym/tomcat1.0
#docker push上去即可
[root@localhost tomcat]# docker push lym/diytomcat:1.0
The push refers to repository [docker.io/lym/diytomcat]
f1cccb8234dc: Preparing
f4fefa1eec06: Preparing
18e7bf733333: Preparing
74ddd0ec08fa: Preparing
提交的时候也是根据镜像的层级来提交的!
因为DockerHub是国外网站,普通的虚拟机访问会被拒绝,无法上传!
发布到阿里云镜像
1、登陆阿里云
2、找到容器镜像服务
3、创建命名空间
4、创建容器镜像
5、浏览阿里云