Docker
docker
环境:centos7
安装步骤
1.CentOS官方的docker安装步骤(版本可能会有点低)升级到最新版
yum install -y docker
docker version
2.使用在线脚本安装(推荐)
curl -fsSL https://get.docker.com -o get -docker.sh
sudo sh get-docker.sh -- mirror Aliyun
启动
sudo systemctl enable docker --开机启动docker
systemctl start docker 启动docker
docker info 查看docker的信息
建立docker用户组
sudo groupadd docker #建立用户组
sudo usermod -aG docker $USER #将当前用户加入docker组
docker镜像加速
在/etc/docker/daemon.json写下如下内容
{
"registry-mirrors":[
"http://hub-mirror.c.163.com"
]
}
重启服务生效
sudo systemctl daemon-reload
sudo systemctl restart docker
docker info 查看是否使用了加速镜像
运行第一个docker容器
1.查看有无docker镜像
docker images
2.运行docker容器,如果没有镜像,这个命令会自己去下载镜像
docker run centos:7 sleep 1000
3.新打开一个linux终端,之前终端会睡眠在Status: Downloaded newer image for docker.io/centos:7,查看系统运行了哪些容器
docker ps
docker ps -a
4.查看docker容器的目录
docker run -t -i centos:7 ls /
5.运行一个新容器并进入命令行
docker run -t -i centos:7 bash
ls
echo "HELLO WORLD" >test.txt
cat test.txt
ls
exit
6.再创建一个新容器并操作
docker run -t -i centos:7 bash
ls
exit
这时会发现test.txt不见了,运行一个新容器会清空之前容器的内容
创建docker镜像
一、docker commit命令
1.docker ps -a 获取 CONTAINER ID
2.docker commit 807b6df15cd9 huang/centos:1.0 创建docker镜像
3.docker images 查看存在的镜像
4.docker run -ti huang/centos:1.0 bash
二、docker build 命令(打包容器成为镜像)
1.mkdir demo
2.cd demo
3.echo "hello world" > test1.txt
3.echo "hello boy" > test2.txt
4.vi Dockerfile
FROM centos:7
COPY test1.txt /demo/
COPY test2.txt /demo/
5.docker build -t huang/demo:1.0 .
6.docker images
7.docker run -ti huang/demo:1.0 bash
COPY为docker build的指令,其他docker build指令略
定制镜像,运行jar
准备一个war包,上传至服务器宿主机,并在同级目录下创建Dockerfile
touch Dockerfile
vi Dockerfile

执行构建
docker build -t session-web:latest
docker images 查看本地是否有镜像
docker run --name session-web -d -p 8888:8080 session-web:latest 运行容器
常见命令
1. docker ps 查看运行的容器
docker ps -a 查看所有容器
1.1.docker inspect a6cf4fb96210 根据ID查看容器的信息
2. docker stop a6cf4fb96210 停止一个容器
3. docker start a6cf4fb96210 启动一个已经存在的容器
4. docker rm -f a6cf4fb96210 删除一个容器
5. docker run -d --name hello_world centos:7 sleep 10 -d后台启动 一个容器并命名
6. docker exec -it a6cf4fb96210 /bin/bash 进入容器
docker run -it 表示运行容器并进入交互界面,想退出容器可以按Ctrl+P+Q或者输入exit ,退出容器且不停止容器
docker run -d 表示后台启动容器
7. docker cp /root/1.txt a6cf4fb96210:/usr/local/ 从宿主机复制文件到容器,交换顺序则从容器复制文件到宿主机
8. docker search mysql 搜索想要的镜像去下载如:mysql
https://hub.docker.com/explore/
docker安装mysql
1.docker pull mysql
2.启动mysql
docker run -p 3306:3306 --name mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql
3.docker exec -it mysql /bin/bash
4.mysql -uroot -p123456
5.ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
数据卷
宿主机和容器之间共用一份目录和文件,即使容器被销毁,数据不会丢失
方法1: Dockerfile中指定VOLUME后的目录,如 VOLUME /var/lib/test
方法2:docker run 后加 -v,如
docker run -d -p 8080:8080 --name tomcat1 -v /root/tomcat/webapps:/usr/local/tomcat/webapps tomcat:7
:左边对应宿主机目录,右边对应容器目录
附:
docker stop $(docker ps -q) 停用全部运行中的容器
docker rm $(docker ps -aq) 删除全部容器
docker stop $(docker ps -q) & docker rm $(docker ps -aq) 一条命令实现停用并删除容器
docker rmi 【镜像id】 删除镜像
Docker命令
新建并启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG]
OPTIONS说明:
--name="容器新名字": 为容器指定一个名称;
-d: 后台运行容器,并返回容器ID,也即启动守护式容器;
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射;
-p: 指定端口映射,有以下四种格式:
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort
- containerPort
退出容器两种方式:
- exit -> 容器停止退出
- ctrl + P + Q -> 容器不停止退出
- 重新进入容器docker attach + CONTAINER ID
19 容器数据卷用v命令添加
容器数据卷作用:
- 容器持久化
- 容器间继承+共享数据
命令添加数据卷:
读写
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
例: docker run -it -v /myDataVolume:/dataVolumeContainer centos
只读
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
例: docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos
添加成功后主机和容器会生成对应的文件夹,文件夹下主机或容器对文件的操作是同步的(双向的),容器停止后,主机修改数据仍然同步。
只读模式下,容器内不可以新建和修改文件,只有主机有权限创建和修改文件,主机对文件的操作会同步到容器中。
进入centos容器的终端执行命令:
docker run -it centos /bin/bash
以json传的形式查看容器信息:
docker inspect + CONTAINER ID
例: docker inspect 67bcd76b7531

只读时的容器信息:

20 容器数据卷用DockerFile添加
DockerFile是什么?
类似 JavaEE Hello.java -----> Hello.class的编译文件
Docker images ------> DockerFile
DockerFile是images镜像模板的描述文件
容器内添加数据卷
- 容器内根目录新建mydocker文件夹并进入
- 可在DockerFile中使用VOLUME指令来给镜像添加一个或多个数据卷
- 构建DockerFile
# volume test
FROM centos
VOLUM["/dataVolumContainer1","/dataVolumeContainer2"]
CMD echo "finished, ------success1"
CMD /bin/bash
- build后生成镜像--->获得一个新镜像zzyy/centos,镜像内带有dataVolumContainer1和dataVolumContainer2文件夹,与主机的文件夹同步,目录地址看第六步
docker build -f /mydocker/dockerfile -t zzyy/centos .
-f : file,指明dockerfile位置
-t : 命名空间
zzyy/centos : 镜像名字
. 代表当前目录下
- run容器
docker run -it zzyy/centos - 最后根据命令
docker inspect + CONTAINER ID可以看到对应的主机目录地址
Docker挂载主机目录Docker访问出现cannot open directory .:Permission denied
解决方法: 在挂载目录后多加一个--privileged=true参数即可
docker run -it -v /宿主机绝对路径目录:/容器内目录 --privileged=true 镜像名
21 容器数据卷volums-from
- 先启动一个父容器dc01, 在文件夹dataVolumContainer2中新增内容
docker run -it --name dc01 zzyy/centos
- 再启动容器dc02/dc03继承dc01,在dc02/dc03容器中修改内容
docker run -it --name dc02 --volumes-from dc01 zzyy/centos
docker run -it --name dc03 --volumes-from dc01 zzyy/centos
- 回到dc01可以看到在dc02/dc03修改的内容
- 删除dc01后修改dc02的内容,dc03中的内容仍然会更新
结论:容器间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
22 DockerFile是什么
概念
DocerkFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
构建DockerFile三步骤
- 编写DockerFile文件
- docker build --->镜像
- docker run ----->容器
DockerFile样例
FROM scratch
MAINTAINER the Centos Project <cloud-ops@centos.org>
ADD c68-docker.tar.gz /
LABLE name="Centos Base Image"\
vendor="Centos" \
#Default command
CMD ["/bin/bash"]
23 DockerFile构建过程解析
DockerFile内容基础知识
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
-
表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
24 保留字指令
FROM:进出镜像,当前镜像是基于哪个镜像的
MAINTAINER:镜像维护者的姓名和邮箱地址
RUN:容器构建时需要执行的命令
EXPOSE:当前容器对外暴露出的端口号
WORKDIR:指定在创建容器后,终端默认登录的进来工作目录,一个落脚点,如果没有指定默认是根目录"/"(就像进入linux系统默认进入的是/root文件夹下)
ENV:用来在构建镜像过程中设置环境变量
ADD:将宿主机目录下的文件拷贝进镜像,且ADD命令会自动处理URL和解压tar压缩包
COPY:类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
VOLUME:容器数据卷,用于数据保存和持久化工作
CMD:指定一个容器启动时要运行的命令。DockerFile中可以有多个CMD命令,但只有最后一个生效(不代表之前的命令不执行),CMD会被docker run之后的参数替换
ENTRYPOINT:指定一个容器启动时要运行的命令。ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数,不过它的命令是追加的,都会执行
ONBUILD:当构建一个被继承的DockerFile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
25 DockerFile案例-自定义镜像mycentos
Base镜像(scratch):DockerHub中99%的镜像都是通过在Base镜像中安装和配置需要的软件构建出来的。
从dockerhub下载的centos默认工作目录是根目录"/",且不支持vim和ifconfig,现在要自定义一个mycentos默认工作目录是/tmp,且支持vim和ifconfig
1. 编写DockerFile
FROM centos
# 配置环境变量和工作目录
ENV MYPATH /tmp
WORKDIR $MYPATH
# 安装vim,net-tools
RUN yum -y install vim
RUN yum -y install net-tools
# 暴露80端口
EXPOSE 80
CMD echo $MYPATH
CMD echo "success------------ok"
CMD /bin/bash
2. 构建
docker build -t 新镜像名字:TAG .
例:docker build -f /mydocker/Dockerfile -t mycentos:1.3 .
# 查看新镜像
docker images mycentos
3. 运行
docker run -it 新镜像名字:TAG
4. 查看镜像的变更历史
# 查看镜像的变更历史
docker history + IAMGE ID
26 DockerFile案例-CMD-ENTRYPOINT命令案例
1) CMD
执行命令
# 启动tomcat
docker run -it -P 7777:8080 tomcat ls -l
不会启动tomcat,因为docker run后的命令ls -l替换了DockerFile里面最后的
CMD ["catalina.sh","run"]
相当于执行了
CMD ls -l
所以tomcat没有运行
2) ENTRYPOINT
构建dockerfile
FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl","-s","http://ip.cn"]
# 构建镜像
docker build -f /mydocker/dockerfile -t myip .
# docker run后会返回ip信息
docker run myip
# 如果需要查看,表头信息需要追加命令 -i,即
docker run myip -i
# 相当于执行了
curl -s -i http://ip.cn
如果用CMD构建的dockerfile
FROM centos
RUN yum install -y curl
CMD ["curl","-s","http://ip.cn"]
执行命令
docker run myip -i
则会报错,相当于执行了
CMD -i
28 DockerFile案例-自定义tomcat
运行自定义tomcat
docker run -d -p 9080:8080 --name myt9
-v /zzyyuse/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test
-v /zzyyuse/mydockerfile/tomcat9/tomcat9logs:/usr/local/apache-tomcat-9.0.8/logs
--privileged=true
zzyytomcat9
这样就可以直接在主机的9080端口查看tomcat,在/zzyyuse/mydockerfile/tomcat9/test目录部署项目,在/zzyyuse/mydockerfile/tomcat9/tomcat9logs目录查看log了

浙公网安备 33010602011771号