Docker学习笔记

Docker

概述

Docker 是一个开源的、轻量级的容器引擎,主要运行于 Linux 和 Windows,用于创建、管理和编排容器。

和 VMware 虚拟机相比,Docker 使用容器承载应用程序,而不使用操作系统,所以它的开销很少,性能很高。但是,Docker 对应用程序的隔离不如虚拟机彻底,所以它并不能完全取代 VMware。

组成

镜像

docker镜像 相当于一个模板, 通过这个模板来创建容器服务,可以创建多个容器

联合文件系统

下载B镜像时,如果已下载镜像A有部分内容重复,那么这部分内容将复用,复用的部分称为镜像的镜像层,而下载的部分为容器层

容器

docker利用容器技术,独立运行一组应用

启动 停止 删除 基本命令

理解为一个简易的linux系统

仓库

公有仓库和私有仓库 docker hub(默认是国外的)

阿里云 有容器服务器(镜像加速)

存放镜像!

安装

卸载旧的

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

在linux上安装docker

软件包

sudo yum install -y yum-utils
//设置镜像仓库 阿里云 默认是国外的
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新软件包索引

yum makecache fast

安装docker

sudo yum install docker-ce docker-ce-cli containerd.io

命令

启动

systemctl start dockers
systemctl start docker.service

查看版本

docker version

运行hello-world镜像

docker run centeros /bin/echo "Hello world"
# Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。

查看镜像

docker images

卸载

sudo yum remove docker-ce docker-ce-cli containerd.io

sudo rm -rf /var/lib/docker

sudo rm -rf /var/lib/containerd

帮助命令

帮助文档 https://docs.docker.com/reference/

docker version  # 显示docker版本信息
docker info  # docker系统信息 包括镜像和容器数量 
docker 命令 --help #帮助命令

镜像命令

docker images 查看所有本地主机上的镜像

#解释
REPOSITORY 镜像的仓库源
TAG   镜像的标签
IMAGE ID 镜像id
CREATED  镜像的创建时间
SIZE  镜像大小
# 可选项
-a --all # 列出所有镜像
-q --quiet # 只显示id

docker serach 搜索镜像名(如mysql)

--filter=STARS=3000 搜素出来的镜像starts大于3000的
例子 docker search mysql --filter=stars=5000

docker pull 下载镜像

docker pull 镜像名:版本
docker pull mysql等价于
docker pull mysql docker.io/libray/mysql:latest

docker rmi 删除镜像

docker rmi -f 镜像id                    删除容器
docker rmi -f 镜像id 镜像id 镜像id   删除多个容器
docker rmi -f $(docker images -aq)  删除全部容器

容器命令

有了镜像后 才能创建容器

下一个centeros

docker pull centos

新建容器并启动 ,操作对象是镜像, 进入后可修改镜像内的文件

docker run [可选参数] image

#参数
-t  在新容器内指定一个伪终端或终端。
-i  允许你对容器内的标准输入 (STDIN) 进行交互。
--name="Name" 容器名字
-d 以后台方式运行 nohup
-it 使用交互方式运行
-p 指定容器的端口 -p 8080:8080
-P 随机指定端口
--restart alway  # always容器退出时重启  on-failure:容器故障退出(返回值非零)时重启 no:容器退出时不重启
 -v 宿主机目录:容器目录  #
  30                   [OK]
# 启动并进入容器
docker run -it centos /bin/bash
exit 会退出并停止容器运行

列出所有运行的容器

docker ps

docker ps #当前正在运行的
-a        #加上历史运行过的
-n=?      #显示最近运行过的
-q        #只显示容器id 

退出容器 启动容器

exit # 停止并退出
Ctrl + P + Q #不停止退出
docker stop 容器id # 退出后 停止运行容器
docker start 容器id
docker restart 容器id
docker kill 容器id #强制..

删除容器

docker rm 容器id               #删除指定容器
docker rm -f $(docker ps -aq) #删除所有容器 

启动容器和停止容器

docker start 容器id
docker restart 容器id
docker stop 容器id 
docker kill 容器id

进入正在运行的容器

#退出当前容器
exit 
# 进入容器 并新起命令行 
docker exec  -it 容器id bash
#进入正在运行的命令行
docker attach 容器id bash 

docker run 和docker exec的区别

  • docker run 根据镜像创建一个容器,然后操作镜像
  • docker exec 是进入一个正在运行的容器

根据容器创建一个新镜像

docker run -it -p xxx  #启动容器
修改容器内的内容

新开一个窗口
docker commit -m="一次提交的信息"  [要修改的容器id] 新的镜像名  #提交镜像
docker commit -a='yc9064' -m='docker新镜像提交测试' 96dd74b37e87 mynginx:v1

docker images #查看重新打好的镜像

docker run -d -p 8080:80 --name mynginx01 --restart always -v /root/nginx/html:/usr/share/nginx/html  mynginx:v1
  • -a :提交的镜像作者;
  • -c :使用Dockerfile指令来创建镜像;
  • -m :提交时的说明文字;
  • -p :在commit时,将容器暂停。

常用其他命令

后台启动

docker run -d centos 
#发现问题
docker ps 发现停止了
后台运行 必要有一个前台进程  docker发现没有应用会自动停止

常看日志

#执行循环脚本
docker run -d centos /bin/sh -c "while true;do echo hi;sleep 5;donre"

#查看容器id
docker ps

#查看输出的日志
docker logs -tf --tail 100 容器id

查看容器中进程信息

docker top 容器id

3.查看容器的元数据

docker inspect 容器id

从容器内拷贝文件到主机

docker cp 容器id:容器内文件路径  目的主机的路径

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xxSBlhvO-1640666584521)(.\img\1.png)]

阿里云镜像加速

登录阿里云找到容器镜像服务

找到镜像加速地址

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{   
  "registry-mirrors": ["https://5gw6wzma.mirror.aliyuncs.com"]
}
EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

使用镜像

安装nginx

docker pull nginx
#查看开放的端口号
firewall-cmd --list-ports 
#开放8080端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent 
#重启
firewall-cmd --reload 
#-p暴露端口(容器的) -d 后台运行 -name 给容器取名
#运行 nginx容器, 名字为nginx01 使用机器的8080端口映射到容器的80端口 
# --restart always重启docker后启动容器
[root@masterServr ~]# docker run -d -p 8080:80 --name nginx01 --restart always -v /root/nginx/html:/usr/share/nginx/html  nginx
WARNING: IPv4 forwarding is disabled. Networking will not work.
b435252b28d1b6a6bf944d470102371658744e10f948b6632249d3e59a0b9311

[root@masterServr ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
b435252b28d1   nginx     "/docker-entrypoint.…"   15 seconds ago   Up 14 seconds   0.0.0.0:3344->80/tcp, :::3344->80/tcp   nginx01
f67252424cc0   centos    "/bin/bash"              18 hours ago     Up 18 hours                                             silly_zhukovsky


安装tomcat

# --rm     停止就删除 用来测试
docker run -it --rm tomcat:9.0

开放端口号
docker pull tomcat:9.0

docker runn -d -p ...

访问url,得到tomcat 404页面

进入容器中的webapp目录 发现为空

说明tomcat镜像被缩减

原因:默认是最小镜像,所有不必要的东西都剔除

容器数据卷

问题:如果数据存在容器中,那么我们删除容器,数据也一并被删除了.

需求: 数据可以持久化.

将容器内的目录挂载到主机上即可

总结: 为了容器的持久化和同步操作,容器间目录也可以共享

命令 -v 主机目录:容器目录

例:

docker run -d -p 8080:80 --name nginx01 --restart always -v /root/nginx/html:/usr/share/nginx/html  nginx

具名和匿名挂载

docker  run ...  -v  [容器内目录] ... # 匿名

docker  run ...  -v  [取个名字]:[容器内目录]:[文件权限 ro/rw] ... # 具名  ro是容器文件只读权限,要改变文本需要走宿主机
docker volume ls # 查看所有挂载
docker inspect [volumeName]

容器间文件同步

容器间信息的传递, 比如mysq容器的l数据同步

docker run -it --name docker01 xxx:1.0
#把dcoker02 绑定到docker01  数据同步
docker run -it --name docker02 --volumes-from dcoker01 xxx:1.0


docker run -it --name docker01 mycentos:v1 bash
docker run -it --name docker02 --volumes-from docker01 mycentos:v1 bash

DockerFile

用来构建docker镜像的构建文件,一段命令脚本

所以 我们不仅可以通过修改容器并commit构建新的镜像到本地 ,也可以通过 docker build [dockerfile文件] 的方式来构建镜像

DockerFile构建过程

我们以后发布项目 ,做镜像 就要编写dockerfile

基础知识:

1.每个保留关键字(指令)必须大写

2.从上到下执行

3.#表示注释

4.每一个指令都会创建提交一个新的镜像层,并提交

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RPCpp8pD-1640666584523)(.\img\2.jpg)]

Dockerfile指令详解

  • FROM

    基础镜像, FROM centos

  • MAINTAINER

    标注作者和邮箱 FROM liuyinchuan yc906478@163.com

  • RUN

    此操作会影响镜像

    • RUN [command]

      shell中使用/bin/sh运行command 比如 RUN echo '这个容器的镜像是通过dockerfile构建的' > readMe.txt

    • RUN ['指定程序','参数1','参数2']

      RUN["/bin/bash","-c","echo hello"]

  • CMD

    CMD用于指定容器启动时执行的命令,每个Dockerfile只能有一个CMD命令,

    构建镜像后,若容器启动时指定了运行的命令,则会覆盖掉CMD中指定的命令

    CMD ['指定程序','参数1','参数2']

  • ENTRYPOINT

    与CMD类似

    构建镜像后,若容器启动时指定了运行的命令,则会在原来的指令中追加

  • EXPOSE

    暴露端口配置 也可 run的时候加上 -p 【端口号】

  • ADD

    加入文件到镜像内 如果是压缩包 会解压缩

    ADD [源文件路径] [镜像内路径]

  • COPY

    与ADD类似 不会解压文件

  • ENV

    设置容器环境变量

    ENV JAVA_HOME=/usr/local/jdk_1.8.201/

  • WORKDIR

    为后续的RUN CMD ENTRYPOINT指定配置工作目录,可以使用多个WORKDIR指令,若后续指令用得是相对路径,则会基于之前的命令指定路径。

    WORKDIR /path

FROM		#基础镜像,一切从这里开始构建
MAINTAINER	#镜像是谁写的,姓名+邮箱
RUN			#镜像构建的时候需要运行的命令
ADD			#步骤,tomcat镜像,这个tomcat的压缩包!添加内容
WORKDIR		#镜像的工作目录	
VOLUME		#匿名挂载的目录
EXPOSE		#暴露端口配置  也可 run的时候加上 -p 【端口号】
CMD			#指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT	#指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD		#当构建一个被继承 Dockerfile 这个时候就会运行ONBUILD 的指令
COPY 		#类似ADD,将我们文件拷贝到镜像中

例:

新建一个dockerfile1

上传 jdk-8u281-linux-x64.tar.gz

vim dockerfile1

FROM centos                        # 使用centos作为基础镜像
MAINTAINER OBy yc906478@163.com

ENV MYPATH=/usr/local
WORKDIR $MYPATH

VOLUME ["volume01","volume02","volume03"]   #匿名挂载目录 

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80
CMD echo
CMD echo "---end---"
CMD /bin/bash
docker build -f dockerfile1 -t mycentos:v1 . #使用当前目录的dockerfile构建v1版的mycentos
docker run -it my

构建镜像

编写好dockerfile后, 可构建镜像到本地

docker build -t nginx:v3 .
docker build -f dockerfileName -t /filepath .

上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

实战

Centos

创建名为Dockerfile的文件,这样不输入文件名build的时候会 找到这个文件

FROM centos:7                       
MAINTAINER OBy yc906478@163.com

ENV MYPATH=/usr/local
WORKDIR $MYPATH

VOLUME ["volume01","volume02","volume03"]

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80
CMD echo "---end---"
CMD /bin/bash

构建:

docker build -f mydockerfile-centeros -t mycentos:0.1 

Tomcat

Dockfile

FROM centos
#作者
MAINTAINER yc 906478612@qq.com
#拷贝tomcat jdk 到镜像并解压
ADD apache-tomcat-8.5.73.tar.gz /usr/local/tomcat
ADD jdk-8u281-linux-x64.tar.gz /usr/local/jdk

RUN yum -y install vim
#定义交互时登录路径
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置jdk 和tomcat环境变量
ENV JAVA_HOME /usr/local/jdk/jdk1.8.0_281
ENV CATALINA_HOME /usr/local/tomcat/apache-tomcat-8.5.73
ENV CATALINA_BASE /usr/local/tomcat/apache-tomcat-8.5.73
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#设置暴露的端口
EXPOSE 8080
#运行tomcat
CMD /usr/local/tomcat/apache-tomcat-8.5.73/bin/startup.sh && tail -f /usr/local/tomcat/apache-tomcat-8.5.73/logs/catalina.out

docker run -d -p 8080:8080 --name mytomcat -v /usr/local/tomcat/logs:/usr/local/tomcat/apache-tomcat-8.5.73/logs/ -v /usr/local/tomcat/webapps:/usr/local/tomcat/apache-tomcat-8.5.73/webapps/ diytomcat

上一篇:JavaWeb专栏之(二):Idea创建JavaWeb项目


下一篇:Linux-Ubuntu-18.04-字符界面-tomcat安装、配置与使用