5分钟Docker从入门到出师

Docker是什么?

Docker是一个开源的应用容器引擎;是一个轻量级容器技术;

Docker支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像;

运行中的镜像称为容器,容器启动速度非常快。

Docker的组成?

docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上);

docker客户端(Client):连接docker主机进行操作;

docker仓库(Registry):用来保存各种打包好的软件镜像,一个 Docker Registry中可以包含多个仓库,每个仓库可以包含多个标签(Tag),每个标签对应着一个镜像;

docker镜像(Images):软件打包好的镜像,放在docker仓库中,镜像不包含任何动态数据,其内容在构建之后也不会被改变。镜像就是一堆只读层(read-only layer);

docker容器(Container):镜像启动后的实例称为一个容器,容器是独立运行的一个或一组应用,容器 = 镜像 + 读写层;

Docker的安装?(安装简单,不再讲解,具体请移步官方文档)

MacOS:https://docs.docker.com/docker-for-mac/install/

Windows:https://docs.docker.com/docker-for-windows/install/

Ubuntu:https://docs.docker.com/install/linux/docker-ce/ubuntu/

Debian:https://docs.docker.com/install/linux/docker-ce/debian/

CentOS:https://docs.docker.com/install/linux/docker-ce/centos/

Fedora:https://docs.docker.com/install/linux/docker-ce/fedora/

其他 Linux 发行版:https://docs.docker.com/install/linux/docker-ce/binaries/

网速慢的可使用Docker国内镜像加速

阿里云的加速器:https://help.aliyun.com/document_detail/60750.html

网易加速器:http://hub-mirror.c.163.com

官方中国加速器:https://registry.docker-cn.com

ustc镜像:https://docker.mirrors.ustc.edu.cn

daocloud:https://www.daocloud.io/mirror#accelerator-doc(注册后使用)

使用docker

1)、容器操作

软件镜像(软件安装程序)----运行镜像----产生一个容器(正运行的应用);

步骤:

1、搜索镜像
[root@localhost ~]#docker search tomcat
2、拉取镜像
[root@localhost ~]#docker pull tomcat
3、根据镜像启动容器
docker run --namemytomcat -d tomcat:latest
4、查看运行中的容器
dockerps
5、停止运行中的容器
dockerstop container-name/container-id
6、查看所有的容器
docker ps -a
7、启动容器
dockerstart container-name/container-id
8、删除一个容器
docker rm container-name/container-id
如果要删除指定镜像的话,需要将该镜像所引用的Container 销毁(停止并删除)。否则,由于 Image 被某个 Container 引用(拿来运行),而无法被删除。
9、删除一个镜像
docker rmicontainer-name/container-id
9、启动一个做了端口映射的tomcat
[root@localhost ~]#docker run -d -p 8888:8080 tomcat
-d:后台运行
-p: 将主机的端口映射到容器的一个端口 主机端口:容器内部的端口
10、查看容器输出
dockerlogs container-name/container-id
需要外网能正常访问,临时关闭linux的防火墙
servicefirewalld status ;查看防火墙状态
servicefirewalld stop:关闭防火墙
11、查看容器的日志
docker logscontainer-name/container-id
12、查看所有镜像
dockerimage ls
最常用的镜像命令:

使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。

docker run --namemynginx -d nginx:latest
使用镜像nginx:latest,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。

dockerrun -p 80:80 -v /data:/data -dnginx:latest
绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。

$ docker run -p127.0.0.1:80:8080/tcp ubuntu bash
使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。

$ docker run -itnginx:latest /bin/bash
root@b8573233d675:/#
docker exec :在运行的容器中执行命令

通过 exec 命令对指定的容器执行,进入容器终端并且的保留为容器终端的输入形式(-it和bash的结合作用)

docker exec -it container-name/container-id /bin/bash

进入容器之后,可以使用命令进行容器的操作,操作与linux命令模式操作一样。

在容器 mynginx 中以交互模式执行容器内 /root/usercode.sh 脚本:

runoob@runoob:~$docker exec -it mynginx /bin/sh /root/usercode.sh www.baidu.com

attach 进入一个运行的容器

build 从一个DockerFile构建镜像

commit 从容器创建一个镜像

cp 从容器和主机文件系统之间拷贝文件

create 创建一个容器

diff 检查容器文件系统上的更改

events 从服务器获取实时事件

export 将容器的文件系统导出为tar存档

history 显示镜像的历史记录

import 从归档文件中创建镜像

inspect 获取容器/镜像的元数据

load 从存档或者STDIN加载镜像

login 登陆docker镜像仓库

logout 退出docker镜像仓库

logs 获取一个容器的日志

pause 暂停一个或多个容器中的所有进程

rename 重命名容器

restart 重启容器

save 将指定镜像保存成 tar 归档文件

top 展示一个容器中运行的进程

unpause 恢复容器中所有的进程

update 更新容器配置

version 显示Docker的版本信息

wait 阻塞直到容器停止,然后打印退出代码

更多命令参看

https://docs.docker.com/engine/reference/commandline/docker/

可以参考每一个镜像的文档

安装MySQL示例:

docker pull mysql
启动:

[root@localhost~]# docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:last
b874c56bec49fb43024b3805ab51e9097da779f2f572c22c69
[root@localhost ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b874c56bec49 mysql “docker-entrypoint.sh” 4 seconds ago Up 3 seconds 3306/tcp mysql01
做端口映射启动:(如果主机中装了同样的软件,建议更改映射其他端口,避免与主机端口冲突导致外部无法访问)

[root@localhost~]# docker run -p 3307:3306 --name mysql02 -e MYSQL_ROOT_PASSWORD=123456 -dmysql:last
ad10e4bc5c6a0f61cbad43898de71d366117d120e39db651844
[root@localhost ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad10e4bc5c6a mysql “docker-entrypoint.sh” 4 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp mysql02

使用命令指定的参数重启后就失效了,来体验一下高级操作:

docker run --namemysql03 -v /conf/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -dmysql:tag

把主机的/conf/mysql文件夹挂载到 mysqldocker容器的/etc/mysql/conf.d文件夹里面

改mysql的配置文件就只需要把mysql配置文件放在自定义的文件夹下(/conf/mysql)

docker run --namesome-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag–character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

指定mysql的一些配置参数

MySQL(5.7.19)的默认配置文件是/etc/mysql/my.cnf 文件。如果想要自定义配置,建议向 /etc/mysql/conf.d 目录中创建 .cnf 文件。新建的文件可以任意起名,只要保证后缀名是 cnf 即可。新建的文件中的配置项可以覆盖 /etc/mysql/my.cnf 中的配置项。

详细操作解释:

首先需要创建将要映射到容器中的目录以及.cnf文件,然后再创建容器

#pwd
/opt
#mkdir -pdocker_v/mysql/conf
#cddocker_v/mysql/conf
touch my.cnf
#docker run -p3306:3306 --name mysql -v /opt/docker_v/mysql/conf:/etc/mysql/conf.d -eMYSQL_ROOT_PASSWORD=123456 -d imageID
4ec4f56455ea2d6d7251a05b7f308e314051fdad2c26bf3d0f27a9b0c0a71414

命令说明:

-p 3306:3306 //将容器的3306端口映射到主机的3306端口

-v /opt/docker_v/mysql/conf:/etc/mysql/conf.d //将主机/opt/docker_v/mysql/conf目录挂载到容器的/etc/mysql/conf.d -v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内绝对路径目录。如果宿主机是绝对路径,则自动在宿主机上使用或生成该目录,如果宿主机使用相对路径,则容器会在/var/lib/docker/volumes/下生成该目录。如果没有指定宿主机的目录,则容器会在/var/lib/docker/volumes/下随机生成一个目录名。

-e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码

-d: 后台运行容器,并返回容器ID

imageID: mysql镜像ID

挂载宿主机已存在目录后,在容器内对其进行操作,报“Permission denied”。

可通过两种方式解决:

1> 关闭selinux。

临时关闭:#setenforce 0

永久关闭:修改/etc/sysconfig/selinux文件,将SELINUX的值设置为disabled。

2> 以特权方式启动容器

指定–privileged参数

如:# docker run-it --privileged=true -v /test:/soft centos /bin/bash

如何自定义镜像?使用Dockerfile

Dockerfile是自动构建 Docker 镜像的配置文件,用户可以使用 Dockerfile 快速创建自定义的镜像。Dockerfile 中的命令非常类似于 Linux 下的Shell 命令。

Docker镜像、容器和 Dockerfile 三者之间的关系:

Dockerfile 分为四个部分:

基础镜像(父镜像)信息指令FROM。

维护者信息指令MAINTAINER。

镜像操作指令 RUN、EVN 、ADD 和 WORKDIR 等。

容器启动指令 CMD、ENTRYPOINT 和 USER 等。

镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

此处以定制 nginx 镜像为例,使用 Dockerfile 来定制。

在一个空白目录中,建立一个文本文件,并命名为 Dockerfile :

$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile
其内容为:

FROM nginx
RUN echo’

Hello, Docker!

’ > /usr/share/nginx/html/index.html
这个 Dockerfile 很简单,一共就两行。涉及到了两条指令, FROM 和 RUN 。

在 Docker Store 上有非常多的高质量的官方镜像,有可以直接拿来使用的服务类的镜像,如nginx 、 redis 、 mongo 、mysql 等;也有一些方便开发、构建、运行各种语言应用的镜像,如 node 、 openjdk 、 python 等。可以在其中寻找一个最符合我们最终目标的镜像为基础镜像进行定制。

如果没有找到对应服务的镜像,官方镜像中还提供了一些更为基础的操作系统镜像,如ubuntu 、 debian 、 centos 等,这些操作系统的软件库为我们提供了更广阔的扩展空间。

除了选择现有镜像为基础镜像外,Docker 还存在一个特殊的镜像,名为 scratch 。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。

详细使用:

1.FROM

格式为FROM image或FROM image:tag,并且Dockerfile中第一条指令必须是FROM指令,且在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令。

2.MAINTAINER

格式为MAINTAINERuser_name user_email,指定维护者信息

3.RUN

格式为RUN command或 RUN[“EXECUTABLE”,“PARAM1”,“PARAM2”…],前者在shell终端中运行命令,/bin/sh -c command,例如:/bin/sh -c"echo hello";后者使用exec执行,指定其他运行终端使用RUN["/bin/bash","-c",“echohello”]

每条RUN指令将当前的镜像基础上执行指令,并提交为新的镜像,命令较长的时候可以使用\来换行。

4.CMD

支持三种格式:

CMD [“executable”,“param1”,“param2”],使用exec执行,这是推荐的方式。

CMD command param1 param2 在/bin/sh中执行。

CMD [“param1”,“param2”] 提供给ENTERYPOINT的默认参数。

CMD用于指定容器启动时执行的命令,每个Dockerfile只能有一个CMD命令,多个CMD命令只执行最后一个。若容器启动时指定了运行的命令,则会覆盖掉CMD中指定的命令。

5.EXPOSE

格式为 EXPOSE port[port2,port3,…],例如EXPOSE 80这条指令告诉Docker服务器暴露80端口,供容器外部连接使用。

在启动容器的使用使用-P,Docker会自动分配一个端口和转发指定的端口,使用-p可以具体指定使用哪个本地的端口来映射对外开放的端口。

6.ENV

格式为:EVN keyvalue 。用于指定环境变量,这些环境变量,后续可以被RUN指令使用,容器运行起来之后,也可以在容器中获取这些环境变量。

例如

ENV word hello

RUN echo $word

7.ADD

格式:ADD src dest

该命令将复制指定本地目录中的文件到容器中的dest中,src可以是是一个绝对路径,也可以是一个URL或一个tar文件,tar文件会自动解压为目录。

8.COPY

格式为:COPY srcdesc

复制本地主机src目录或文件到容器的desc目录,desc不存在时会自动创建。

9.ENTRYPOINT

格式有两种:

ENTRYPOINT[“executable”,“param1”,“param2”]

ENTRYPOINT command param1,param2 会在shell中执行。

用于配置容器启动后执行的命令,这些命令不能被docker run提供的参数覆盖。和CMD一样,每个Dockerfile中只能有一个ENTRYPOINT,当有多个时最后一个生效。

10.VOLUME

格式为 VOLUME["/data"]

作用是创建在本地主机或其他容器可以挂载的数据卷,用来存放数据。

11.USER

格式为:USERusername

指定容器运行时的用户名或UID,后续的RUN也会使用指定的用户。要临时使用管理员权限可以使用sudo。在USER命令之前可以使用RUN命令创建需要的用户。

例如:RUN groupadd-r docker && useradd -r -g docker docker

12.WORKDIR

格式: WORKDIR/path

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

13.ONBUILD

格式ONBUILD[INSTRUCTION]

该配置指定当所创建的镜像作为其他新建镜像的基础镜像时所执行的指令。

例如下面的Dockerfile创建了镜像A:

ONBUILD ADD . /app

ONBUILD RUN pythonapp.py

则基于镜像A创建新的镜像时,新的Dockerfile中使用from A 指定基镜像时,会自动执行ONBBUILD指令内容,等价于在新的要构建镜像的Dockerfile中增加了两条指令:

FROM A

ADD ./app

RUN python app.py

14.docker build

创建好Dockerfile之后,通过docker build命令来创建镜像,该命令首先会上传Dockerfile文件给Docker服务器端,服务器端将逐行执行Dockerfile中定义的指令。

通常建议放置Dockerfile的目录为空目录。另外可以在目录下创建.dockerignore文件,让Docker忽略路径下的文件和目录,这一点与Git中的配置很相似。

通过 -t 指定镜像的标签信息,例如:docker build -t regenzm/first_image .##"."指定的是Dockerfile所在的路径

例:通过dockerfile构建Tomcat网站环境镜像

FROMcentos:v1
MAINTAINER wang
ADDapache-tomcat-8.5.37.tar.gz /usr/local/
ADDjdk-8u191-linux-x64.rpm /root/
RUN rpm -ivh/root/jdk-8u191-linux-x64.rpm
WORKDIR/usr/local/apache-tomcat-8.5.37/
ENTRYPOINT[“bin/catalina.sh”,“run”]
EXPOSE 8080
例:通过dockerfile构建ssh服务器

FROMcentos:v1
MAINTAINERwang
ENV ROOT_PASSWORD123456
RUN yum install -yopenssh-server
RUN echo$ROOT_PASSWORD |passwd --stdin root
RUN ssh-keygen -tdsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -trsa -f /etc/ssh/ssh_host_rsa_key
CMD["/usr/sbin/sshd","-D","&"]
EXPOSE 22

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值