docker学习

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、 bare metal、OpenStack 集群和其他的基础应用平台。 

 

镜像(image)

镜像可以理解为一个模板,里边有一些东西,可以通过run命令来进行运行。通过某一个镜像可以创建多个容器(最终的服务或者是项目就是运行在容器里边的)

 

容器(container)

Docker利用容器技术可以独立运行一个或者一组应用。可以通过镜像运行启动、停止、删除的基本命令

目前可以把容器理解为一个简易的Linux系统

 

仓库(repository)

存放镜像的地方分为公有仓库(Docker hub、腾讯云、阿里云等等)和私有仓库

公有仓库默认都是国外的,需要配置镜像加速

 

常用的命令

镜像命令

docker images查看本机全部镜像 

[root@centoss dockertest]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   6 months ago   13.3kB

# 详细解释
REPOSITORY    镜像的仓库源
TAG           镜像的版本标签信息
IMAGE ID      镜像的ID
CREATED       镜像的创建时间
SIZE          镜像的大小

# 可选项
Options:
  -a, --all             # 列出所有的镜像
      --digests         # 展示digests签名信息
  -q, --quiet           # 只显示镜像的ID
  ###################################### 这下便的并不常用就不再多家解释了
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print images using a Go template
      --no-trunc        Don't truncate output

docker search 搜索镜像

一个查找MySQL镜像的实例

[root@localhost muyi]# docker search mysql
NAME                            DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                           MySQL is a widely used, open-source relation…   14048               [OK]                
mariadb                         MariaDB Server is a high performing open sou…   5367                [OK]                
phpmyadmin                      phpMyAdmin - A web interface for MySQL and M…   783                 [OK]                
percona                         Percona Server is a fork of the MySQL relati…   604                 [OK]                
bitnami/mysql                   Bitnami MySQL Docker Image                      83                                      [OK]
databack/mysql-backup           Back up mysql databases to... anywhere!         82                                      
linuxserver/mysql-workbench                                                     48                                      
ubuntu/mysql                    MySQL open source fast, stable, multi-thread…   45                                      
linuxserver/mysql               A Mysql container, brought to you by LinuxSe…   38                                      
circleci/mysql                  MySQL is a widely used, open-source relation…   29                                      
google/mysql                    MySQL server for Google Compute Engine          23                                      [OK]
rapidfort/mysql                 RapidFort optimized, hardened image for MySQL   14                                      
bitnami/mysqld-exporter                                                         4                                       
vitess/mysqlctld                vitess/mysqlctld                                1                                       [OK]

docker pull下载镜像

# 下载命令格式:docker pull mysql[:tag]

[root@centos dockertest]# docker pull mysql
Using default tag: latest            # 上边没有写tag要求具体的版本号,这边的就是下载latest最新版
latest: Pulling from library/mysql
f003217c5aae: Pull complete          # 分层下载,docker images的核心  联合文件系统
65d94f01a09f: Pull complete
43d78aaa6078: Pull complete
a0f91ffbdf69: Pull complete
59ee9e07e12f: Pull complete
04d82978082c: Pull complete
70f46ebb971a: Pull complete
db6ea71d471d: Pull complete
c2920c795b25: Pull complete
26c3bdf75ff5: Pull complete
9ec1f1f78b0e: Pull complete
4607fa685ac6: Pull complete
Digest: sha256:1c75ba7716c6f73fc106dacedfdcf13f934ea8c161c8b3b3e4618bcd5fbcf195    # 签名信息(防伪标志)
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest    # 真实地址,也就是说"docker pull mysql"和"docker pull docker.io/library/mysql:latest"是同一个意思

# 下载其他版本的话可以查官方支持的版本。然后比如说:
docker pull mysql:5.7
# 下边有一张图可以看到官方提供的信息,5.7是存在的

###########################################
[root@centos dockertest]# docker pull mysql:5.7
5.7: Pulling from library/mysql
f003217c5aae: Already exists        # 这些东西实际上都是使用的共用的,这就是docker的联合文件系统所讲到的东西
65d94f01a09f: Already exists
······
ba61822c65c2: Pull complete
······
Digest: sha256:1a73b6a8f507639a8f91ed01ace28965f4f74bb62a9d9b9e7378d5f07fab79dc
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
###########################################

# 解释
Options:
  -a, --all-tags                Download all tagged images in the repository
      --disable-content-trust   Skip image verification (default true)
      --platform string         Set platform if server is multi-platform capable
  -q, --quiet                   Suppress verbose output

docker rmi删除镜像(这边的rmi代表的是remove image)

[root@centos dockertest]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
mysql         5.7       f26e21ddd20d   2 days ago     450MB
mysql         latest    667ee8fb158e   2 days ago     521MB
hello-world   latest    feb5d9fea6a5   6 months ago   13.3kB
[root@centos dockertest]# docker rmi -f 667ee8fb158e
Untagged: mysql:latest
Untagged: mysql@sha256:1c75ba7716c6f73fc106dacedfdcf13f934ea8c161c8b3b3e4618bcd5fbcf195
Deleted: sha256:667ee8fb158e365450fc3f09712208fe44e9f1364a9b130fed95f3f4862f8a63
Deleted: sha256:daba3b5cd1b725f259d5d59049c7011f6a20f2e7e4782b873cadeedbc1a4f122
Deleted: sha256:407a68a397de3c8e4da2ccd388f27c795519414cc9319f674e7b9a492cd8514b
Deleted: sha256:6967db79cb8031d7e505dd82c91c6426e84c6ad2098d06c1c090485886bc1c63
Deleted: sha256:3dcc0f922d11309b2e4870d5f42c5005f086c9b9c1e128ed2b712b65fa79a5c9
Deleted: sha256:ae5d4ab2734d5c27069212b2690dc2c7ac4cd85ee5e122607cb175f7fe908914
[root@centos dockertest]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
mysql         5.7       f26e21ddd20d   2 days ago     450MB
hello-world   latest    feb5d9fea6a5   6 months ago   13.3kB

# !!!!删除全部镜像
docker rmi -f $(docker images- aq) # 这边的$代表的是传参,执行$后边括号里边的内容并发送到前边进行执行,简单来说就是查询目前所有镜像的id并依次删除

# 解释
Options:
  -f, --force      Force removal of the image
      --no-prune   Do not delete untagged parents

容器命令

docker run 启动容器

命令格式:docker run [可选参数] (image)

常见参数说明:
--name="NAME"    # 给容器起的名字
-d               # 表示以后台方式运行
-i   -t   -it    # 使用交互方式运行,可以进入容器查看内容
-p               # 指定容器的端口,可以主机映射 比如:-p 8080:8080
    -p (ip:主机端口:容器端口)
    -p (主机端口:容器端口)    # 常用
    -p (容器端口)
-P               # 上边的是小写的p,这个是大写的,表示随机指定端口

docker ps查看所有正在运行中的容器

# 查看正在运行的容器
[root@centos dockertest]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
# 查看运行过的容器倒序输出
[root@centos dockertest]# docker ps -a
CONTAINER ID   IMAGE         COMMAND       CREATED         STATUS                     PORTS     NAMES
de33bc517d24   centos        "/bin/bash"   6 minutes ago   Exited (0) 2 minutes ago             stupefied_rhodes
403730c6b9e3   hello-world   "/hello"      2 hours ago     Exited (0) 2 hours ago               kind_kare
d7d3f3b9bc35   hello-world   "/hello"      2 hours ago     Exited (0) 2 hours ago               cranky_almeida

# 常用选项
docker ps        # 列出当前正在运行的容器
          -a     # 列出当前正在运行的容器以及曾经运行过的容器
          -n=?   # 显示最近创建的容器(传入的参数表示显示个数)
          -q     # 只显示容器的编号(和只显示镜像编号那里(注意下))

快捷键退出容器

exit        # 容器停止并退出
Crtl -P+Q   # 容器不停止并退出

docker rm删除容器

docker rm (容器id)    # 不能删除正在运行中的容器,如果需要删除运行中的容器需要加上-f
docker rm -f $(docker ps -aq) # 删除全部容器
docker ps -a -q|xargs docker rm # 删除全部容器

启动和停止容器docker start

docker start (容器id)    # 启动容器
docker restart (容器id)  # 重启容器
docker stop (容器id)     # 停止容器
docker kill (容器id)     # 暴力停止容器
docker attach (容器id)   # 进入正在运行中的容器

其他命令

查看日志 :docker logs (容器id)

查看容器进程信息:docker top (容器id)

查看容器详细信息:docker inspect

进入当前正在运行的容器:
docker exec -it

docker attach

从容器拷贝文件到主机上:docker cp (容器id:容器内路径) (目的主机路径)

 

镜像的一些打包用法

docker commit 提交容器成为一个新的副本

docker commit -m="提交的描述信息" -a="作者" (容器id) (目标镜像名)[:TAG]

这就相当于自己打包了镜像(也可以理解为给容器打了一个快照)

 

容器数据卷

容器之间有一个数据共享的技术。Docker容器中产生的数据同步到本地。这就是卷技术。

是为了容器的持久化和持续操作。容器之间也是可以数据互享的。

方法一:使用命令来挂载 -v

docker run -it -v (主机目录:容器内目录)
[root@centos dockertest]# cd /test/
[root@centos test]# ls
[root@centos test]# touch testfile
[root@centos test]# cd -
/root/dockertest
[root@centos dockertest]# docker run -it  -v /test:/home centos /bin/bash
[root@a7e0491886d9 /]# cd /home
[root@a7e0491886d9 home]# ls
testfile
[root@a7e0491886d9 home]# touch 222
[root@a7e0491886d9 home]# exit
[root@centos dockertest]# ls /test
222  testfile

只要容器不删,哪怕容器是停机装填,他就会一直保持数据卷挂载的同步状态

方法二:具名和匿名挂载

docker volume命令

-v 容器内路径              # 匿名挂载
-v 卷名:容器内路径         # 具名挂载
-v 容器外路径:容器内路径    # 指定路径挂载
[root@centos txl]# docker inspect 250bdae058d4
···
        "Mounts": [
            {
                "Type": "volume",
                "Name": "7372e6be2a993e3cff79846371ef90e1e7ddd209a9c0dff7bcaaba272b38fe9c",
                "Source": "/var/lib/docker/volumes/7372e6be2a993e3cff79846371ef90e1e7ddd209a9c0dff7bcaaba272b38fe9c/_data",
                "Destination": "VOLUME01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "4cb2f082d81143929600c1870f9a51f85802671eaf61a0d33d0e6f469eca65f4",
                "Source": "/var/lib/docker/volumes/4cb2f082d81143929600c1870f9a51f85802671eaf61a0d33d0e6f469eca65f4/_data",
                "Destination": "VOLUME02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

方法三:dockerfile

[root@centos dockertest]# ls
dockerfile  testfile
[root@centos dockertest]# vim dockerfile
[root@centos dockertest]# cat dockerfile
FROM centos

VOLUME ["VOLUME01","VOLUME02"]

CMD echo "-----END------"
CMD /bin/bash
[root@centos dockertest]# docker build -f dockerfile -t txl/centos:1.0 .
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM centos
 ---> 5d0da3dc9764
Step 2/4 : VOLUME ["VOLUME01","VOLUME02"]
 ---> Running in e01b0997d34a
Removing intermediate container e01b0997d34a
 ---> e5476437958b
Step 3/4 : CMD echo "-----END------"
 ---> Running in a0d34e70e0fe
Removing intermediate container a0d34e70e0fe
 ---> 45a3c6498922
Step 4/4 : CMD /bin/bash
 ---> Running in 2baca78f3a23
Removing intermediate container 2baca78f3a23
 ---> 27760c78f582
Successfully built 27760c78f582
Successfully tagged txl/centos:1.0
[root@centos dockertest]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
txl/centos    1.0       27760c78f582   59 seconds ago   231MB

通过上边的文件成功创建出了txl/centos:1.0镜像,这是dockerfile的文件内容

# 所有指令全部大写
FROM centos    # 给予Centos

VOLUME ["VOLUME01","VOLUME02"]    # 挂载磁盘

CMD echo "-----END------"        # 输出end
CMD /bin/bash                    # 使用/bin/bash终端
# 这里的每个命令,都是镜像的一层

数据卷容器

--volumes-from表示跟随某个容器挂载的目录

首先创建两个容器docker01和docker02,并要求docker02的使用docker01创建的卷

[root@centos _data]# docker run -dit --name docker01 txl/centos:1.0
8e809b855b362dff150aa2c244f0036d48c0bcd51cbdb89fa62ab25b731f2ae9
[root@VM-20-15-centos _data]# docker run -itd --name docker02 --volumes-from docker01 txl/centos:1.0
c63f3797c7ba9df3ad8955ac81c65222f69e6279e54e2a37d30a97e5f174009e

docker01中的处理

[root@centos dockertest]# docker attach docker01
[root@8e809b855b36 /]# ls
VOLUME01  VOLUME02  bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@8e809b855b36 /]# cd VOLUME01/
[root@8e809b855b36 VOLUME01]# ls
[root@8e809b855b36 VOLUME01]# touch 1contain.txt
[root@8e809b855b36 VOLUME01]# ls
1contain.txt

这里是docker02

[root@Vcentos dockertest]# docker attach docker02
[root@c63f3797c7ba /]# ls
VOLUME01  VOLUME02  bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@c63f3797c7ba /]# cd VOLUME01/
[root@c63f3797c7ba VOLUME01]# ls
[root@c63f3797c7ba VOLUME01]# ls
1contain.txt

最终发现,只要容器和容器之间的卷连接了起来,只要其中一个容器的卷还没有丢,那公有数据就丢不了

 

 

Dockerfile

docker镜像的构建文件就是dockerfile,是一个命令参数脚本

构建过程

每个保留关键字(指令)都必须是大写字母
执行顺序从上到下
·#·表示注释
每一个指令都会创建提交到一个新的镜像层,并提交
dockerfile是面向开发的,发布项目,做镜像,都需要编写dockerfile文件

dockerfile指令

FROM:基础镜像(官方的基础镜像一般基础scatch镜像)
MAINTAINER:镜像作者||维护者信息(一般是姓名+邮箱)
RUN:镜像构建的时候需要运行的命令
ADD:步骤(比如说tomcat镜像,就需要加上去拷贝并解压tomcat压缩包的步骤)
WORKDIR:镜像的工作目录。可以自己定义
VOLUME:挂载到某个容器卷
EXPOSE:规定对外开放的端口
CMD:指定这个容器启动的时候需要运行的命令,只有最后一个会生效,可被替代(可以被docker run -l 的形式替代掉)
ENTRYPOINT:指定这个容器启动的时候需要运行的命令,可以追加命令(可以使用docker run -l 的形式追加命令)
ONBUILD:当构建一个被继承的Dockerfile的时候就会执行这里的命令。是一个触发命令
COPY:类似ADD,将我们的文件拷贝到镜像中
ENV:构建的时候设置环境变量

手写一个dockerfile

FROM centos
# 基于centos基础镜像
MAINTAINER xiaolongtongxue<13350581502@qq.com>
# 开发人员信息(邮箱写错了...)

ENV MYPATH /usr/local
# 定义环境变量MYPATH
WORKDIR $MYPATH
# 定义工作目录

RUN yum -y install vim
# 运行命令使用yum安装vim和net-tools
RUN yum -y install net-tools

EXPOSE 80
# 暴露80端口

# 输出
CMD echo $MYPATH
CMD echo "------end-------"
CMD /bin/bash
# 使用/bin/bash终端

docker build构建镜像mycentos:0.1

[root@centos dockerfile]# docker build -f mydockerfile1 -t mycentos:0.1 .
[root@centos dockerfile]# docker run -it mycentos:0.1 /bin/bash

CMD命令和ENTRYPOINT命令

CMD命令的结果可以被传入的命令替代掉

entrypoint是允许在后边添加补充命令的,但是cmd的话就是直接覆盖

 

dockerfile一图概括

posted @ 2023-04-19 16:01  木易同学  阅读(78)  评论(0编辑  收藏  举报