【docker】docker学习

docker概念

docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上);
docker客户端(Client):连接docker主机进行操作﹔
docker仓库(Registry):用来保存各种打包好的软件镜像﹔
docker镜像(Images):软件打包好的镜像﹔放在docker仓库中;

镜像就像安装包,容器就是安装的应用程序

可以通过镜像安装多个相同的应用程序,但是端口号不能相同

安装docker:

  • yum包更新 【sudo yum update】
  • 安装软件包yum-util提供yum-config-manager功能【sudo yum install -y yum-utils device-mapper-persistent-data lvm2】
  • 设置yum源 【sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo】
  • 安装docker 【sudo yum install docker -ce】
  • 查看版本:【docker -v】
  • 启动docker 根据linux版本进行相应命令

操作docker相关命令

检查内核版本,必须是3.10及以上【uname ‐r】 
安装docker(输入y确认安装)【yum install docker 】 
查看版本【docker ‐v】
开机启动docker 【systemctl enable docker】

启动docker 【systemctl start docker 】
停止docker 【systemctl stop docker】
docker概要信息【docker info】
docker帮助文档【docker --help】

镜像仓库

Docker默认仓库地址是Docker Hub官网地址。

设置ustc镜像便于docker拉取某些需要的镜像 ustc:老牌linux镜像服务提供者 ustc的docker镜像加速器速度很快

  • 编辑文件【vi /etc/docker/daemon.json】
  • 输入内容
{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

镜像与容器

镜像命令

镜像是构建docker的基石,可以将镜像当做容器的源代码 体积小,便携,易分享存储和更新
由于镜像可能重名(如版本不同),所有通过tag即标签区分
镜像可以从所设置的源中拉取

  • 【docker images】 查看镜像
  • 【docker search 镜像名称】 搜索镜像 如:docker search redis
  • 【docker pull 镜像名称:tag】 拉取镜像
  • 【docker rmi 镜像id】 删除镜像 镜像有运行中的容器时不能删除
  • 【docker rmi ‘docker images -q’】 删除全部镜像

容器命令

通过镜像简单启动容器:【docker run -d 容器名称:标签】

通过镜像启动容器(指定参数):【docker run --name 自己给容器随便取个名称(–name和这里的名称可省) -p 主机端口:容器端口 -d 容器名称:标签】

  • 标签即相当于版本,latest标签即最新的意思
  • 参数:
    • –name 容器名称
    • [-p]为docker和本机物理端口映射
    • [-d]为后台运行

容器命令:

  • 查看正在运行的容器 :【docker ps】

  • 查看所有容器: 【docker ps -a】

  • 查看最后一次运行的容器:【docker ps -l】

  • 启动容器:【docker start 容器名称或id】

  • 停止容器:【docker stop 容器名称或id】

  • 文件拷贝:【docker cp 待拷贝文件路径 容器名称:路径】宿主机到容器 容器关闭时也可以正常拷贝文件进去

  • 查看容器ip:

    • 【docker inspect 容器名称】 显示一推信息
    • 【docker inspect --format=’{{.NetWorkSettings.IPAddress}}’ 容器名称 】 直接显示ip地址,其他信息也可以这样显示
  • 删除容器:【docker rm 容器名称】 需要停止容器后才能进行移除

  • 进入容器:【docker exec -it 容器名称或id /bin/bash】 进入容器后操作命令和linux一致就行

  • 退出到宿主机位置 容器停止:【docker exit】

  • 查看容器运行日志:【docker logs -f 容器tag】

交互式容器

使用交互式运行容器,容器运行后直接进入到容器内部,退出容器内部后,容器直接关闭

创建交互式容器:【docker run -it --name 容器名称 镜像名称:标签 /bin/bash 】

  • 交互式创建容器后即进入到容器
  • 参数:
    • -i:表示运行容器
    • -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
  • 每个容器相当于一个小电脑(服务器)

通过镜像启动容器 也可以通过docker exec -it 容器名称或id /bash 进入容器进行操作

守护式容器

守护式进程的特点是:

  • 能够长期运行
  • 没有交互式会话
  • 适合运行应用程序和服务

创建守护式容器: 【docker run -id --name 容器名称 镜像名称:标签】

将容器保存为镜像
# 基于自己容器创建的镜像创建容器,该新建的容器默认包含自己容器所拥有的资源,因为是基于其创建的
【docker commit 容器名称 镜像名称】
【docker run -di --name=myxxx -p 宿主机端口:容器端口 自己容器所保存的镜像名称】  

# 镜像导入导出
【docker save -o 文件路径  镜像名称】 镜像导出为镜像文件
【docker load -i 文件路径】 镜像文件恢复为镜像

docker数据卷

目录挂载:宿主机目录和容器目录形成映射关系。 目录挂载后,操作宿主机的目录即操作容器的目录

创建容器时加【-v 宿主机目录:容器目录】 如:
【docker run -id --name=mycentos3 centos:7 -v /usr/local/myhtml:/usr/local/myhtml】
【docker run -id -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7】也可以

目录挂载即docker数据卷。需求:为了部署demo工程,需要使用到cp的命令将宿主机内的demo文件复制到容器内部

数据卷:将宿主机的一个目录,映射到容器的一个目录中,可以在宿主机中操作目录中的内容,那么容器内部映射的文件,也会跟着一起改变。

  • 创建数据卷:【docker volume create 数据卷名称】 创建数据卷之后,默认会存放在一个目录下/var/1ib/docker/volumes/数据卷名称/_data
  • 查看数据卷的详细信息【docker volume inspect 数据卷名称】
  • 查看全部数据卷:【docker volume ls】
  • 删除数据卷 【docker volume rm 数据卷名称】
  • 应用数据卷
# 1----通过创建好的数据卷进行映射。当映射数据卷时,如果数据卷不存在,Docker会自动创建,会将容器内部自带的文件存储在默认的存放路径中。
docker run -v 数据卷名称︰容器内部的路径 镜像id

# 2----直接通过路径进行映射。直接指定一个路径作为数据卷的存放位置,这个路径下是空的。
docker run -v 路径︰容器内部的路径 镜像id

Dockerfile

Dockerfile就是一系列命令和参数构成的脚本 这些命令应用于基础镜像并最终创建一个新的镜像。 文件名称:【Dockerfile】

存在意义:更方便构建镜像文件

  • 开发:提供一个完全一致开发环境
  • 测试:直接拿开发时构建的镜像或通过dockerfile文件构建一个镜像开始工作
  • 运维:部署时可以实现应用无缝移植

相关指令:

  • 【from image_name:tag】定义使用哪个基础镜像启动构建流程
  • 【maintainer user_name】声明镜像创建者
  • 【env key value】设置环境变量(可写多条)
  • 【run command】dockerfile的核心部分(可写多条)
  • 【add source_dir/file dest_dir/file】宿主机文件复制到容器内 如果是压缩文件,复制后会自动解压
  • 【copy source_dir/file dest_div/file】和add类似,但有压缩文件不会被解压
  • 【workdir path_div】 设置工作目录

例子:构建jdk1.8镜像 基于centos:7

  • 创建目录 上传jdk的tar包 进入目录
  • 构建dokerfile文件 名称必须叫dockerfile 进入文件
  • 编写文件 保存
FROM centos:7
MAINTAINER xiaoai
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre7
ENV CLASSPATH $JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

【docker build -t=‘jdk1.8’ Dockerfile所在目录】 所在当前目录则用 .表示 通过Dockerfile构建镜像

说明

Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本镜像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。

可以在Dpcker文件中使用RUN,CMD,FROM,EXPOSE,ENv等指令。

构建镜像:【docker bui1d -t 镜像名称[:tag]】

基本结构

  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行指令

常用指令

from:指定基础镜像,必须为第一个命令

# 格式:
    FROM <image>
    FROM <image> :<tag>
    FROM <image>@<digest>
#示例: 
	FROM mysq1 :5.6

# 注: tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

maintainer:维护者信息

# 格式:
    MAINTAINER <name>
# 示例:
    MAINTAINER Jasper Xu
    MAINTAINER sorex@163.com
    MAINTAINER Jasper Xu<sorex@163.com>

run:构建镜像时执行的命令

RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:she11执行
# 格式:
	RUN <command> 

# exec执行格式:
    RUN [ "executab1e","param1", "param2"]
# 示例:
    RUN [ ""executable","param1","param2""]
    RUN apk update
    RUN ["/etc/execfi1e","arg1","arg1"]

# 注:RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如: docker build --no-cache

add:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget

# 格式:
    ADD <src>. . . <dest>
    ADD ["<src>" ,... "<dest>"]用于支持包含空格的路径
# 示例:
    ADD hom*/mydir/
# 添加所有以"hom"开头的文件
	ADD hom?.txt /mydir/
# ?替代一个单字符,例如:"home.txt"
	ADD test relativeDir/#添加“test”到^wORKDIR `/relativeDir/ADD test /absoluteDir/#添加“test”到/absoluteDir/

copy:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
cmd:构建容器后调用,也就是在容器启动时才进行调用。

# 格式:
	CMD ["executable" , "param1" , "param2"](执行可执行文件,优先)
	CMD ["param1 " , "param2"](设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
	CMD command param1 param2(执行she11内部命令)
# 示例:
	CMD echo "This is a test." l wc -
	CMD ["/usr/bin/wc" , "--he1p"]

# 注:CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

entrypoint :配置容器,使其可执行化。配合CMD可省去"application",只使用参数。

# 格式;
	ENTRYPOINT ["executable","param1","param2""](可执行文件,优先)ENTRYPOINT command param1 param2 (she11内部命令)
# 示例:
    FROM ubuntu
    ENTRYPOINT ["top","-b"]CMD ["-c"]

# 注: ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而dockerrun命令中指定的任何参数,都会被当做参数再次传递。
# ENTRYPOINT。Dockerfile中只允许有一个。
# ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。

label:用于为镜像添加元数据

# 格式:
	LABEL <key>=<value> <key>=<value> <key>=<value> ...示例:
	LABEL version="1.0" description="这是一个web服务器" by="ghz"

# 注:使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。

env:设置环境变量

# 格式:
	# <key>之后的所有内容均会被视为其<va1ue>的组成部分,因此,一次只能设置一个变量
    ENV <key> <value>
    # 可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
    ENV <key>=<value> ...
# 示例:
	ENV myName John DoeENV myDog Rex The Dog
	ENV mycat=f1uffy

expose:指定于外界交互的端口

# 格式:
    EXPOSE <port> [<port>...]
# 示例:
    EXPOSE 80 443
    EXPOSE 8080 EXPOSE 11211/tcp 11211/udp
    
# 注:EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口

volume:用于指定持久化目录

# 格式:
    VOLUME ["/path/to/dir"]
# 示例:
    VOLUME ["/data"]
    VOLUME ["/var/www","/var/log/apache2","/etc/apache2"]
# 注:一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
# 1卷可以容器间共享和重用
# 2容器并不一定要和其它容器共享卷3修改卷后会立即生效
# 4对卷的修改不会对镜像产生影响
# 5卷会一直存在,直到没有任何容器在使用它

workdir:工作目录,类似于cd命令

# 格式:
    WORKDIR /path/to/workdir
# 示例:
    WORKDIR /a(这时工作目录为/a)
    WORKDIR b (这时工作目录为/a/b)
    WORKDIR c(这时工作目录为/a/b/c)

# 注:通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w 参数覆盖构建时所设置的工作目录。

user:指定运行容器时的用户名或UID,后续的 RUN也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户

# 格式:
    USER user
    USER user: groupUSER uid
    USER uid:gidUSER user:gidUSER uid: group
# 示例:
	USER www
	
# 注:使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。

age:用于指定传递给构建运行时的变量

# 格式:
	ARG <name>[=<default value>]
# 示例:
	ARG site
	ARG bui1d_user=www

onbuilde:用于设置镜像触发器

# 格式: 
	ONBUILD [INSTRUCTION]
# 示例:
    ONBUILD ADD . /app/src
	ONBUILD RUN /usr/loca1/bin/python-bui1d --dir /app/src
	
# 注:当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发

实例1 构建nginx镜像

# This my first nginx Dockerfile
# version 1.0
# Base images基础镜像
FROM centos
# MAINTAINER维护者信息
MAINTAINER ghz
# ENV设置环境变量
ENV PATH/usr/loca1/nginx/sbin : $PATH
# ADD文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/loca1/ # ngix
ADD epe1-release-latest-7.noarch.rpm /usr/1oca1/ #企业linux扩展包
# RUN执行以下命令
RUN rpm -ivh /usr /loca1/epe1-release-1atest-7.noarch.rpm
RUN yum instal1 -y wget lftp gcc gcc-c++ make openss1-deve1 pcre-deve1 pcre && yum cleana11
RUN useradd -s /sbin/no1ogin -M www
# WORKDIR相当于cd
WORKDIR /usr/loca1/nginx-1.8.0
RUN ./configure --prefix=/us r/1oca1/nginx --user=www --group=www --with-http_ss1_module --with-pcre && make && make insta11
RUN echo "daemon off; " >>/etc/nginx.conf
#EXPOSE映射端口
EXPOSE 8o
#CMD运行以下命令
CMD ["nginx"]

实例2 tomcat镜像

  • 打成war包
# 把项目打成war包
jar -cvfMo demo.war demo/*
  • 通过Dockerfile
FROM daoc1oud.io/library/tomcat:8.5.15-jre8
ADD demq.war /usr/1oca1/tomcat/webapps
  • 在Dockerfile目录下执行构建镜像命令
# 通过Dockerfile构建镜像
docker build -t tomcat_my:1.2 .
  • 查看镜像并通过构建的镜像创建容器
# 查看镜像
docker images
# 启动镜像
docker run -d -p 8080:8080 --name tomcat imageId

docker私有仓库

私有仓库存放镜像,中央仓库存放通用镜像,私有仓库可以存放自己所构建的镜像,便于同一局域网的使用

  • 拉取私有仓库镜像 【docker pull registry】
  • 创建容器即创建私有仓库 【docker run -di --name=registry -p 5000:5000 registry】
  • 网页访问仓库【宿主机ip:容器创建时映射的端口/v2/_catalog】 访问到json数据即私有仓库创建成功
  • 修改配置文件使docker信任私有仓库才能上传镜像到私有仓库【vi /etc/docker/daemon.json】添加配置:
{
  "insecure_registries":["私服ip地址:端口"]
}
  • 重启docker服务

镜像上传到私有仓库

【docker tag 镜像名称 私服ip和端口/镜像名称】如【docker tag jdk1.8 192.168.x.x:5000/jdk1.8】打标签 相当于复制一个镜像为上传做准备
【docker push 私服ip和端口/镜像名称】 如【docker push 192.168.x.x:5000/jdk1.8】 上传镜像到私服
访问私服可以查看到上传的镜像
获取镜像 【docker pull 私服ip和端口/镜像名称】

例:docker搭建应用环境:

mysql部署

拉取镜像:【docker pull centos/mysql-centos7】 后面即mysql路径

创建容器:【docker run -di --name tensquare_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD 密码 镜像名称】

参数:

  • -p 端口映射 操作宿主机33306端口即相当于操作容器的3306端口

  • -e MYSQL_ROOT_PASSWORD = 指定mysql密码

  • –mysql图形化界面软件即可进行mysql连接(通过宿主机来连接容器中的mysql) 需要:宿主机ip 密码 用户名 端口==映射的宿主机的端口如33306

tomcat部署

拉取镜像 pull

创建容器 【docker run -di --name mytomcat -p 9000:8080 -v /usr/local/webapps:/usr/local/webapps tomcat:7-jre7】

使用目录挂载后由于做了目录映射,直接在网页访问tomcat是无法直接访问的,可以把war包上传到目录下进行访问

nginx部署

拉取镜像 pull
创建容器 【docker run -di --name mynginx -p 80:80 nginx】

redis部署

拉取镜像 pull
创建容器 【docker run -di --name myredis -p 6379:6379 redis】
测试:客户端进入cmd -》redis-cli -h 远程ip -》连接成功,存储查询正常即完成。

例:docker简单使用例子

通过docker构建tomcat部署web项目。

复制项目到容器目录运行

1- 准备一个简单web项目并上传到linux

  • 目录结构
│  index.html
└─WEB-INF
        web.xml
  • 文件内容
<!-- web.xml -->
<?xm1 version=""1.0" encoding="UTF-8""?>
<web-app xm1ns="http://xm1ns.jcp.org/xm1/ns/javaee"
		xm1ns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://xm1ns.jcp.org/xm1/ns/javaee
						http://xm1ns.jcp.org/xm1/ns/javaee/web-app_3_1.xsd"
		version="3.1"
		metadata-complete="true">
</web-app>


<!-- index.html -->
<!doctype html>
<html>
<head>
    <title>dockerTest</title>
</head>
<body>
    <h1>hello docker!</h1>
</body>
</html>
  • 上传linux 如: 通过FileZilla工具上传

2-通过Docker安装tomcat

# 获取Tomcat镜像
docker pu17 daocloud.io/library/tomcat:8.0.45
# 查看Tomcat镜像
docker images
# 创建Tomcat容器
docker run -d -p 8080:8080 --name tomcat 镜像tag(获取IMAGE ID, imageId不用输完整也行)
# 查看tomcat启动 浏览器访问http://ip地址:8080

3-把上传的项目复制到tomcat的webapp目录下

# 查看运行的容器
docker ps
# 进入tomcat容器查看目录
docker exec -it imageId bash
# 进入webapps 查看路径  输出路径: /usr/local/tomcat/webapps
cd webapps
pwd

# 可以退出容器 获取重新打开一个终端    进入项目所在目录复制项目到webapp目录
exit
docker cp ./demo/ imageId:/usr/local/tomcat/webapps

# 可以再次进入tomcat容器查看是否复制成功
docker exec -it imageId bash
cd webapps
ls

4- 浏览器访问项目 可通过【docker logs -f tomcat】查看运行日志

在这里插入图片描述

复制项目到数据卷映射目录操作运行

1、2、4一致:如果基于上面直接复制项目到容器目录了可以删除项目后停止容器

# 进入到容器内tomcat的webapp目录中
rm -r demo/
# 停止容器
docker stop [imageId(可通过[docker ps查看])
docker rm 容器名称/imageId

3-创建数据卷映射目录并复制项目到映射的目录下

# 1-----创建数据卷
docker volume create v01
# 启动容器时进行数据卷映射
docker run -d -p 8080:8080 -v v01:/usr/local/tomcat/webapps/ --name tomcat imageId
# 可以通过【docker volume  ls】查看数据卷列表。查看数据卷详细信息获取docker自动创建数据卷时映射的路径,即挂载路径:[MountPoint]
docker volume inspect v01
# 复制项目到映射的路径中
cp demo -r /var/lib/docker/volumes/v01/_data

# 2----直接映射目录
# 创建映射的目录
mkdir tomcat_webapps
# 停止tomcat并删除容器
docker stop 容器名称/imageId
docker rm 容器名称/imageId
# 创建容器直接映射目录 
# 如:docker run -d -p 8080:8080 -v /root/other/dockerTest/tomcat_webapps:/usr/local/tomcat/webapps/ --name tomcat feba
docker run -d -p 8080:8080 -v 需要映射的路径:/usr/local/tomcat/webapps/ --name tomcat imageId
# 项目复制到映射的目录中
cp demo -r /root/other/dockerTest/tomcat_webapps

docker-compose

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值