Your Heart's A Bird Without The Wings To Fly
Docker 1 :基础使用
Docker 1 :基础使用

Docker 1 :基础使用

后台启动容器

# 命令docker run -d 镜像名
​
root@test:~# docker run -d centos
​
# 发现centos停止了
​
# docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就回自动停止。

查看日志

# docker logs -f -t --tail 10 容器id

查看容器中的进程信息

# docker top 容器id

查看镜像的元数据

# docker inspect 容器id
​
# 测试
root@test:~# docker inspect els01
[
    {
        "Id": "d6d6428d8b10c9e6429e1026ca044f4391dbbbd70caaa7769f3db1c28f3329e9",
        "Created": "2021-07-25T12:46:37.772352564Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "elasticsearch-${EK_VERSION}/bin/elasticsearch -E http.host=0.0.0.0 --quiet & kibana-${EK_VERSION}-linux-x86_64/bin/kibana --allow-root --host 0.0.0.0 -Q"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 6839,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-08-02T06:26:27.939440836Z",
            "FinishedAt": "2021-07-27T16:35:52.286976892Z"
        },
​

进入当前正在运行的容器

#方式一
# docker exec -it 容器id /bin/bash   进入容器后开一个新的终端
​
#方式二
# docker attach 容器id               进入容器正在执行的终端,不会启动的进程
​

从容器内拷贝文件到主机

# docker cp 容器id:/path/path  /path

小结

作业测试1

# 安装tomcat
​
# docker run -it --rm tomcat:9.0    一般用来测试,用完即删
​
# 下载并启用 
# docker run -itd --name tomcat01 -p 2222:8080 tomcat

作业测试2

# 安装elasticsearch + kibana
​
# docker run -d --name els01 -p 9200:9200 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
​
# es是一个非常占用内存的服务,需要添加一些内存限制。不然会非常卡。

可视化工具

portainer

# 安装
docker run -d -p 8888:9000 --restart-always -v /var/run/docker.sock:var/run/docker/sock --privileged=true portainer/portainer

Docker镜像讲解

镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运环境的开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

如何得到镜像:

  • 从远程仓库下载
  • 别人拷贝给你
  • 自己制作镜像 DockerFile

UnionFS(联合文件系统)

这是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一次次的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。

Docker镜像加载原理

Docker的镜像实际上由一层层的文件系统组成。

为什么平时安装进虚拟机的Cent OS都是好几个G,Docker才200M?

对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令

虚拟机是分钟级,容器是秒级!

commit镜像

docker commit # 提交容器成为一个新的镜像
​
docker commit -m="提交的描信息" -a="作者" 容器id 目标镜像名:[TAG]
​
例:
docker commit -m"new tomcat" -a="zhifeng"  xxxxx  newtomcat:1.0
​
如果你想要保存当前的容器状态,就可以通过commit来提交,获得一个镜像,就好比VMware的快照。

容器数据卷

什么是容器数据卷

如果数据都在容器中,那么删除容器,数据就会丢失。

例 :安装了MySQL,容器删了,库也没了!需求:MySQL数据可以存储在本地。

容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地。

类似于目录的挂载,将容器中的目录,挂载到Linux上!

总结一句话:容器的持久化和同步操作,容器间也是可以数据共享的。

使用数据卷

方式一:使用命令来进行挂在 -v

docker run -it -v 主机目录:容器内目录

docker inspect 容器id
# 找到mounts查看是否成功

实战:安装MySQL

思考:MySQL的数据持久化的问题

# 安装启动是需要配置密码的,需要注意!
docker run -d -p 3310:3306 -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:tag

-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字

假设将容器删除

docker rm 容器id
#但挂载在本地的数据卷没有丢失,这就实现了容器数据持久化

具名和匿名挂载

#匿名挂载
docker run -d -P --name nginx01 -v /etc/nginx nginx   #容器内部的路径

#查看所有volume情况
docker volume ls
看到都是乱码
这种就是匿名挂载,我们-v只写了容器内部的路径,没有写容器外部的路径!

#具名挂载
通过-v 卷名:容器内路径
root@test:~# docker run -d -P --name nginx02 -v juming:/etc/nginx nginx

root@test:~# docker volume ls
DRIVER   VOLUME NAME
local     juming

root@test:~# docker volume inspect juming
[
  {
       "CreatedAt": "2021-08-13T15:07:18+08:00",
       "Driver": "local",
       "Labels": null,
       "Mountpoint": "/var/lib/docker/volumes/juming/_data",
       "Name": "juming",
       "Options": null,
       "Scope": "local"
  }
]

所有的docker容器内的卷,没有制定目录的情况下都是在/var/lib/docker/volumes/xxx/_data
我们通过具名挂载可以放方便的找到我们的一个卷,大多数情况是使用具名挂载

拓展

通过-v 容器内路径:ro rw 改变读写权限

ro readonly
rw readwrite

docker run -d -P -name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P -name nginx02 -v juming-nginx:/etc/nginx:rw nginx

ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部无法操作

初识DockerFile

Dockerfile就是来构建docker镜像的文件

通过这个脚本可以生成镜像,镜像是一层一层的,是一个个命令,每个命令都是一层的

FROM centos

VOLUME ["volume01","volume02"]

CMD echo "------end------"

CMD /bin/bash

#这里的每一个命令,就是镜像的一层

数据卷容器

多个mysql实现数据共享

docker run -it --name docker02 --volumes-from docker01 centos
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

#这个时候,可以实现两个容器数据同步!

结论

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器为止,除非容器全部停止或删除

但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的。

DockerFile

简介

DockerFile是用来构建Docker镜像的文件,即命令参数脚本

构建步骤: 1.编写一个DockerFile文件

2.docker build构建成一个镜像

3.docker run 运行

4.docker push 发布镜像

DockerFile的指令

FROM       # 基础镜像,一切从这里开始
MAINTAINER # 作者
RUN        # 镜像构建的时候需要运行的命令
ADD        # 添加内容 比如apache
WORKDIR    # 镜像工作目录
VOLUME     # 挂载的目录位置
EXPOSE     # 暴露端口
CMD        # 指定这个容器启动时要运行的命令,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加
COPY       # 类似ADD,将我们文件拷贝到镜像中
ENV        # 构建的时候设置环境变量

实战测试

创建一个自己CentOS

FROM centos
MAINTAINER zhifeng
​
ENV MYPATH /var/www
WORKDIR $MYPATH
​
RUN yum -y install vim
RUN yum -y install net-tools
​
EXPOSE 80
​
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
​
# 镜像构建
docker build -f /root/dockerfile -t mycentos:0.1 .
# 运行容器
docker run -it mycentos:0.1
# 使用 docker history 镜像id 构建过程

CMD和ENTRYPOINT的区别

#编写测试CMD
root@test:~# cat dockerfile 
FROM centos
CMD ["ls","-l"]#构建镜像
root@test:~# docker build -f dockerfile -t cmdtest .
​
#docker run后会执行ls -l
bin
dev
...#想追加一个-a,会报错,只能替换,这就是CMD的特性
docker run cmdtest -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.docker run cmdtest ls -la
total 56
drwxr-xr-x   1 root root 4096 Aug 17 09:15 .
drwxr-xr-x   1 root root 4096 Aug 17 09:15 ..
-rwxr-xr-x   1 root root    0 Aug 17 09:15 .dockerenv
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
#编写测试ENTRYPOINT
FROM centos
ENTRYPOINT ["ls","-l"]
​
#构建镜像
root@test:~# docker build -f dockerfile -t entrypoint .
​
#docker run后会执行ls -l
bin
dev
...
​
#想要追加的话直接在后面加-a
​
Docker中很多命令是相似的,最好的学习就是测试

实战:Tomcat镜像

发布到Docker HUB

登陆
#docker login -u -p
​
提交
#docker push 镜像xxx:1.0
自己发布的镜像尽量带上版本号

发布到ALi Cloud

1.登陆阿里云
2.找到容器镜像服务
3.创建命名空间
4.创建容器镜像

Leave a Reply

Your email address will not be published. Required fields are marked *