Docker安装以及使用,镜像、容器基本使用

docker概念

通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用用户的APP及其运行环境能够做到“一次镜像,处处运行”,将应用打成镜像,通过镜像成为运行在docker容器上面的示例,docker容器在任何操作系统上都是一致的,从而实现跨平台、跨服务。

一句话总结,docker是解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。

传统虚拟机技术与容器虚拟化技术

虚拟机:带环境安装的一种解决方案。在主操作系统上安装的一个虚拟机管理系统(如在windows上安装VMWare),创建虚拟机(包括各种硬件),在虚拟机上安装从操作系统,在从操作系统中安装部署各种应用。对于windows底层系统来说,虚拟机就是一个普通文件,不需要了就删除。 慢、资源占用多

容器:将软件运行所需要的资源打包到一个隔离的容器中。应用进程直接运行于宿主的内核,容器内没有自己的内核且没有进行硬件虚拟。每个容器之间相互隔离,容器之间进程不会相互影响。轻量级、启动速度快、占用体积小

容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统虚拟机则是在硬件层面上实现虚拟化。

docker安装网站

docker下载:https://www.docker.com

安装docker镜像的仓库:https://hub.docker.com

安装docker的前提条件

docker运行在CentOS 7上,要求系统为64位、Linux系统内核版本为3.8以上。

cat /etc/redhat-release uname -r

docker容器部署

docker本身是一个容器运行载体或称之为管理引擎。把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是镜像文件。通过这个镜像文件才能生成docker容器实例。从而实现项目的部署。镜像文件可以看作是容器的模板。docker根据镜像文件生成容器的实例。同一个镜像文件可以生成多个同时运行的容器实例。

docker的三个概念

Image(镜像)

一个只读模板。镜像可以用来创建docker容器,一个镜像可以创建很多容器。docker镜像文件类似于java的类模板,docker容器实例类似于java中new出来的实例对象。

Container(容器)

容器类似于一个虚拟化的运行环境,是用镜像创建的运行实例。容器为镜像提供了一个标准的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的。创建容器时会自动执行镜像自带的一些指令,从而实现该应用的运行。

Repository(仓库)

用来存储镜像的地方。

把docker镜像通过push命令推送到docker仓库,就可以在任何能使用docker命令的地方通过pull命令把这个镜像拉取下来。

docker安装(CentOS7)

官网:

https://docs.docker.com/engine/install/centos/

安装docker的前提条件

1、docker运行在CentOS7上,要求系统为64位、Linux系统内核版本为3.8以上。

cat /etc/redhat-release uname -r

2、卸载旧版本,清除系统残余(如果服务器之前没有装过docker,可以直接跳过此步骤)

sudo yum remove docker

3、yum安装gcc相关(确保环境能访问外网)

yum -y install gcc yum -y install gcc-c++

4、安装需要的软件包

yum install -y yum-utils

5、设置stable镜像仓库

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

6、更新yum缓存

sudo yum makecache fast

如果觉得占用磁盘空间,可以使用 yum clean 指令清除缓存:【 yum clean all 】

安装docker

7、安装docker-ce

yum -y install docker-ce docker-ce-li containerd.io

8、启动docker

sudo systemctl start docker #验证docker是否安装成功 docker info docker run hello-world

开机启动docker

sudo systemctl enable docker

9、卸载docker服务

systemctl stop docker yum remove docker-ce docker-ce-cli containerd.io rm -rf /var/lib/docker rm -rf /var/lib/containerd

10.镜像加速

mkdir /etc/docker/daemon.json

输入内容:

{

         "registry-mirrors": ["https://e4k4ovut.mirror.aliyuncs.com"],

         "log-driver":"json-file",

         "log-opts": {"max-size":"500m", "max-file":"4"}

}

systemctl daemon-reload

systemctl restart docker

docker安装(Ubuntu)

1、卸载旧版本

sudo apt-get remove docker docker-engine docker.io containerd runc

2、获取软件最新源

sudo apt-get update sudo apt upgrade

3、安装apt依赖包

sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common

4、安装GPG证书

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

5、验证

sudo apt-key fingerprint 0EBFCD88

6、设置稳定版仓库

sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

7、安装docker

sudo apt-get install docker-ce docker-ce-cli containerd.io

8、启动docker

systemctl start docker

9、测试

sudo docker run hello-world

阿里云镜像加速

加速器链接获取:

阿里云-容器-容器镜像服务-镜像工具-镜像加速器

开启加速:

mkdir -p /etc/docker

###registry-mirrors中的加速器链接需要自己获取

tee /etc/docker/deamon.json <<- 'EOF'

{

        "registry-mirrors": ["https://e4k4ovut.mirror.aliyuncs.com"]

}

EOF

systemctl daemon-reload

systemctl restart docker

docker-帮助启动类命令

启动docker

systemctl start docker

停止docker

systemctl stop docker

重启docker

systemctl restart docker

查看docker状态

systemctl status docker

开机启动

systemctl enable docker

查看docker概要信息

docker info

查看docker总体帮助

docker --help

查看docker命令帮助

docker 具体命令 --help

docker-镜像命令

创建镜像

在当前目录下使用Dockerfile脚本创建一个镜像,并把这个镜像标记为v1

docker build -t 镜像名:v1 .

也可以在根目录下建立一个build.sh的shell脚本来执行这个命令

vim build.sh docker build -t 镜像名:v1 .

本地镜像管理

1、查看镜像

#列出本地所有镜像

docker images

docker images -a #列出本地所有镜像(含历史映像层)

docker images -q #只显示镜像id

2、删除镜像

#删除镜像

docker rmi 镜像名

docker rmi -f 镜像id #强制删除

docker rmi -f $(docker images -qa) #删除所有镜像

3、镜像重命名

#将镜像1重新标记为镜像2

docker tag 镜像1:v1 镜像2:v2

4、查看镜像创建历史

docker history 镜像1

5、镜像归档

# 将镜像registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn保存成 sinn_v1.tar 归档文件

docker save -o sinn_v1.tar registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn

docker save -o 归档文件 镜像1

6、基于归档文件创建镜像

docker import 归档文件 新镜像:tag

远程仓库镜像管理

1、登录远程镜像仓库: docker login 用户信息 仓库地址

# 登录到官方Docker Hub仓库

docker login -u 用户名 -p 密码

# 登录到阿里云docker仓库

docker login --username=用户名 registry.cn-hangzhou.aliyuncs.com

2、拉取镜像:docker pull 镜像

docker pull registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn:v1

3、推送镜像: docker push 镜像

docker push registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn:v1

4、搜索镜像: docker search 镜像名

# 从官方Docker Hub仓库搜索node镜像

docker search node

镜像的使用

镜像通过docker run命令使用的,这是关于容器部分的操作。

# 指定使用registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn:v1镜像创建并启动容器

docker run --name sinn-server -p 8080:8080 registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn:v1

列出本地主机上的镜像

docker images

docker images -a #列出本地所有镜像(含历史映像层)

docker images -q #只显示镜像id

查询某镜像(是否存在)

docker search 镜像名字

docker search --limit 5 镜像名字 #只列点赞最多的5个

下载镜像,TAG为版本,不写时默认最新版

docker pull 镜像名字[:TAG]

查看镜像/容器/数据卷所占的空间

docker system df

删除镜像

docker rmi 镜像id

docker rmi -f 镜像id #强制删除

docker rmi -f $(docker images -qa) #删除所有镜像

虚悬镜像:仓库名、标签都是\的镜像,俗称虚悬镜像dangling image

docker-容器命令

容器的创建和启动

通过docker run命令即可实现容器的创建,并也会启动容器,这个命令实际上就包含了创建和启动容器两部分工作。

#新建+启动容器(前台交互式)

docker run -it --name [容器名] [镜像名] /bin/bash

#后台守护式启动容器

docker run -d 镜像名

--name="容器名"

-d:后台运行容器并返回容器ID,也即启动守护式容器(后台运行)

-i:以交互模式运行容器,通常与-t同时使用

-t:为容器重新分配一个伪输入终端,通常与-i同时使用

-P:随机端口映射,大写P

-p:指定端口映射,小写p

对于mysql、redis等只需要后台做服务器的,建议后台守护式启动

为了方便操作,可以把命令写在一个shell脚本里面,这样只需要执行shell脚本即可,不需要每次都手动输入

# release-sinn.sh

docker run --name sinn-server -p 8888:8888 -d -e 'NODE_ENV=production' --restart=always registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn:v1

# --name sinn-server 指定容器名为sinn-server

# -p 8888:8888 指定宿主机8888端口与容器内的8888端口形成映射

# -d 守护进程运行

# -e 'NODE_ENV=production' 设置环境变量NODE_ENV为production

# --restart=always 开机自启动

# registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn:v1 指定的镜像

容器的管理

1、查看容器: docker ps

# 列出所有正在运行的容器

docker ps

2、启动已停止的容器: docker start

# 启动一个或多少已经被停止的容器

docker start [options] [containers]

3、停止容器:docker stop

# 停止正在运行的容器

sinn-server docker stop sinn-server

#强制停止容器

docker kill ID/容器名

4、重启容器:docker restart

# 重启正在运行的名称为sinn-server的容器

docker restart sinn-server

5、删除容器: docker rm

#删除容器 sinn-server

docker rm sinn-server

#若容器未停止则需要 -f强制删除

注意:删除容器命令是docker rm ,删除镜像命令是docker rmi

6、进入容器: docker exec

这个命令比较重要,因为通常我们需要进入容器内去操作一些东西。

docker exec -it 容器名称/ID 终端

# 例子: 进入ID为0d15561b9f10的容器

docker exec -it sinn-server bash

docker exec -it 0d15561b9f10 /bin/bash

注意: 进入容器后,如果想退出容器,只需要输入exit命令执行即可。

7、查看容器日志:docker logs

# 查看容器sinn-server的日志

docker logs sinn-server

8、容器与主机之间的数据拷贝:docker cp

# 将主机的/data/user目录拷贝到容器sinn-server内的/data/user目录

docker cp /data/user sinn-server:/data/user

# 将容器sinn-server内的/data/user目录拷贝到主机的/data/user目录

docker cp sinn-server:/data/user /data/user

9、查看容器内运行的进程

docker ps ID

10、查看容器内部细节

docker inspect ID

11、进入正在运行的容器并以命令行交互

exec进入,是在容器中打开新的终端,并启动新的进程,exit退出时容器不会停止,因此工作中常使用exec

docker exec -it ID/容器名 /bin/bash

attach进入,是直接进入容器启动命令的终端,不会启动新的进程,exit退出时容器会停止

docker attach ID

12、退出容器

exit         #run进去容器,exit退出,容器停止

ctrl+p+q         #run进去容器,ctrl+p+q,容器不停止

13、导入和导出容器

export导出容器的内容留作为一个tar归档文件

docker export ID > 文件名.tar

import从tar包中的内容创建一个新的文件系统再导入为镜像

cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号

docker容器数据卷

卷就是目录或文件,存在于一个或多个容器中,由docker挂载都容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此docker 不会在容器删除时删除其挂载的数据卷。

docker容器的数据以容器卷的方式完成数据的持久化,通过映射,将容器内的数据备份,持久化到本地主机目录。也就是说:将docker容器内的数据保存进宿主机的磁盘中。

容器卷的特点:

1、数据卷可在容器之间共享或重用数据

2、卷中的更改可以直接实时生效

3、数据卷中的更改不会包含在镜像的更新中

4、数据卷的生命周期一直持续到没有容器使用它为止

宿主vs容器之间映射添加容器卷

#直接命令添加

docker run -it --privileged -v /宿主机绝对路径目录:/容器内目录[:rw] 镜像名         #rw:容器内可读写(默认),若只读则为ro

#查看数据卷是否挂载成功

docker inspect 容器ID

卷的继承和共享-容器2继承容器1的卷规则

docker run -it --privileged -v /mydocker/u:/tmp/u --name u1 /bin/bash docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu

docker安装常用软件

安装Tomcat

#docker hub上查找tomcat镜像

docker search tomcat

#从docker hub上拉取tomcat镜像到本地

docker pull tomcat

#查看是否有拉取到的tomcat

docker images tomcat

#使用tomcat镜像创建容器实例

docker run -d -p 8080:8080 --name t1 tomcat

#新版本tomcat可能会无法直接在网页看到“猫”,需要修改文件名

rm -f webapps

mv webapps.dist webapps

#因此可以下载旧版tomcat:

docker pull billygoo/tomcat8-jdk8

安装MySQL

#在docker仓库中搜索一下MySQL

docker search mysql #

安装MySQL

docker pull mysql:8.0

docker pull mysql //默认拉取最新版本

#查看本地仓库镜像是否下载成功

docker images mysql:8.0

#创建并运行MySQL8.0容器

docker run -p 3307:3306 --name mysql8.0 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0(简单版,实际使用中不可用)

docker run -d -p 3306:3306 --privileged=true

-v /home/cwm/mysql/log:/var/log/mysql

-v /home/cwm/mysql/data:/var/lib/mysql

-v /home/cwm/mysql/conf:/etc/mysql/conf.d

-e MYSQL_ROOT_PASSWORD=123456

--name mysql mysql:8.0

#解决中文乱码问题

cd /home/cwm/mysql/conf

vim my.cnf

#插入

[client]

default_character_set=utf8

[mysqld]

collation_server = utf8_general_ci

character_set_server = utf8

# 重启容器

docker restart mysql

#查看mysql8.0容器运行情况

docker ps

#docker登录mysql

docker exec -it mysql8.0 /bin/bash

#连接数据库

mysql -uroot -p

安装Redis

#从docker hub上拉取redis镜像到本地

docker pull redis

#redis配置文件下载地址

https://redis.io/docs/management/config/

#修改redis.conf

1.注释掉#band 127.0.0.1

2.daemonize yes改成no

3.开启redis数据持久化 appendonly yes 可选

# 在宿主机新建redis目录

mkdir -p /app/redis

# 准备模板conf文件拷贝到redis目录下

cp /myredis/redis.conf /app/redis/

cd /app/redis

#创建并运行redis容器

docker run -p 6379:6379 --name myredis --privileged=true

-v /home/cwm/redis/redis.conf:/etc/redis/redis.conf

-v /home/cwm/redis/data:/data

-d redis:6.0.8 redis-server /etc/redis/redis.conf

#验证redis连接

docker exec -it myr3 /bin.bash redis-cli

#证明docker启动使用了自己指定的配置文件,修改宿主机的redis配置文件,database改为10,docker restart myr3

select 15 会报错

安装JDK

docker pull primetoninc/jdk:1.8

#启动JAVA镜像容器

docker run -d -it --name java primetoninc/jdk:1.8

参数说明:

run:启动一个镜像容器

-d:指定容器运行于后台

-it:-i 和 -t 的缩写;

        -i:以交互模式运行容器,通常与 -t 同时使用 

        -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用

--name:第一个“java”是为容器指定了一个别名,而第二个“java”指的是下载镜像时的名称

#查看jdk是否安装成功

# 执行命令进入正在运行的容器的shell

docker exec -it java bash

# 在容器内部执行Java版本检查

java -version

docker中部署jar包运行

###创建dockerfile文件

cd /opt

mkdir dockerTest

cd dockerTest

rz demo.jar

#新建DockerFile,(本地新建 DockerFile 编辑好内容后上传)

        # jdk 是一个已有的包含 jdk 的镜像

        FROM java:8

        # 作者签名

        MAINTAINER libigtong

        #VOLUME指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp

        VOLUME /tmp

        #将jar包添加到容器中并更名为zzyy_docker.jar

        ADD docker_boot-0.0.1-SNAPSHOT.jar zzyy_docker.jar

        #运行jar包

        RUN bash -c 'touch /zzyy_docker.jar' ENTRYPOINT ["java","-jar","/zzyy_docker.jar"]

        # 设置对外端口为 8080

        EXPOSE 8080

###生成镜像

docker build -t zzyy_docker:1.6 .

###生成并运行容器

docker run --name dockerApp -p 8080:8080 -d 28dae64bba9d

###启动容器

docker container ls docker start cc7c3a1582d0

###运行效果查看

docker attach cc7c3a1582d0

###关闭容器

docker stop cc7c3a1582d0 

Dockerfile

Dockerfile是用来构建docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构建成的脚本。Dockerfile定义了进程需要的一切东西。

基础知识:

1.每条保留字指令都必须为大写字母且后面要跟随至少一个参数

2.指令按照从上到下,顺序执行

3.#表示注释

4.每条指令都会创建一个新的镜像层并对镜像进行提交

Docker执行Dockerfile的大致流程

1.docker从基础镜像运行一个容器

2.执行一条指令并对容器做出修改

3.执行类似docker commit的操作提交一个新的镜像层

4.docker再基于刚提交的镜像运行一个新容器

5.执行dockerfile中的下一条指令直到所有指令都执行完成

Dockerfile常用保留字指令

FROM:基础镜像,指定一个已经存在的镜像作为模板,Dockerfile第一条必须是FROM

MAINTAINER:镜像维护者的姓名和邮箱地址

RUN:容器建构时需要运行的命令,有shell、exec格式,RUN是在docker build时运行

例:RUN yum -y install vim

EXPOSE:当前容器对外暴露出的端口

WORKDIR:指定在创建容器后,终端默认登录的进来工作目录,一个落脚点(根目录)

USER:指定该镜像以什么样的用户去执行,如果都不指定,默认是root

ENV:用来在构建镜像过程中设置环境变量

VOLUME:容器数据卷,用于数据保存和持久化工作

ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包

COPY:类似ADD,拷贝文件和目录到镜像中,将从构建上下文目录中<源路径>的文件/目录复制到新的一层镜像内的<目标路径>位置

        COPY src dest

        COPY ["src","dest"]

        <src源路径>:源文件或源目录

        <dest目标路径>:容器内的指定路径,该路径不用实现建好,路径不存在的话,会自动创建

CMD:指定容器启动后要干的事情。Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换。

        CMD是在docker run时运行

        RUN是在docker build时运行

ENTRYPOINT:也是用来指定一个容器启动时要运行的命令。类似于CMD命令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当做参数送给ENTRYPOINT指令指定的程序。

Dockerfile案例

要求:centos7镜像具备vim+ifconfig+jdk8

编写:

mkdir myfile

cd myfile(该目录下已有下载好的jdk8压缩包)

        vim Dockerfile

        FROM centos

        MAINTAINER zzyy<zzyybs@126.com>

        ENV MYPATH /usr/local

        WORKDIR $MYPATH

        #安装vim编辑器

        RUN yum -y install vim

        #安装ifconfig命令查看网络IP

        RUN yum -y install net-tools

        #安装java8及lib库

        RUN yum -y install glibc.i686

        RUN mkdir /usr/local/java

        #ADD时相对路径jar,把jdk-8u171-Linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置

        ADD jdk-8u171-linux-x86.tar.gz /usr/local/java

        #配置java环境变量

        ENV JAVA_HOME /usr/local/java/jdk1.8.0_171

        ENV JRE_HOME $JAVA_HOME/jre

        ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH

        ENV PATH $JAVA_HOME/bin:$PATH

        EXPOSE 80

        CMD echo $MYPATH

        CMD echo "success--------ok"

        CMD /bin/bash

构建:docker bulid -t centosjava8:1.5 .

运行:docker run -it ID /bin/bash

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值