docker基础篇

Docker

1. Docker结构

在这里插入图片描述
与虚拟机相比,Docker利用的是宿主机的内核,把可复用的底层抽离出来,像是堆积木一样,在基础之上独立的创建Docker容器,且互不干扰

2. Docker的基本概念

2.1. 镜像(image)

资源文件,可以理解为安装包文件。
可以通过docker hub查询所需镜像,在服务器上通过以下命令进行拉取

docker pull "资源":"指定版本号"

# 查询镜像文件也可以在docker命令行中查询,例如查询mysql
docker search mysql

# 结果
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   12028     [OK]       
mariadb                           MariaDB Server is a high performing open sou…   4607      [OK]       
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   900                  [OK]
percona                           Percona Server is a fork of the MySQL relati…   568       [OK]       
phpmyadmin                        phpMyAdmin - A web interface for MySQL and M…   435       [OK]       
mysql/mysql-cluster               Experimental MySQL Cluster Docker images. Cr…   92                   
centos/mysql-57-centos7           MySQL 5.7 SQL database server                   92                   
centurylink/mysql                 Image containing mysql. Optimized to be link…   59                   [OK]
databack/mysql-backup             Back up mysql databases to... anywhere!         54                   
prom/mysqld-exporter                                                              46                   [OK]
deitch/mysql-backup               REPLACED! Please use http://hub.docker.com/r…   40                   [OK]
tutum/mysql                       Base docker image to run a MySQL database se…   35                   
linuxserver/mysql                 A Mysql container, brought to you by LinuxSe…   35                   
schickling/mysql-backup-s3        Backup MySQL to S3 (supports periodic backup…   31                   [OK]
mysql/mysql-router                MySQL Router provides transparent routing be…   23                   
centos/mysql-56-centos7           MySQL 5.6 SQL database server                   21                   
arey/mysql-client                 Run a MySQL client from a docker container      20                   [OK]
fradelg/mysql-cron-backup         MySQL/MariaDB database backup using cron tas…   18                   [OK]
genschsa/mysql-employees          MySQL Employee Sample Database                  9                    [OK]
openshift/mysql-55-centos7        DEPRECATED: A Centos7 based MySQL v5.5 image…   6                    
devilbox/mysql                    Retagged MySQL, MariaDB and PerconaDB offici…   3                    
ansibleplaybookbundle/mysql-apb   An APB which deploys RHSCL MySQL                3                    [OK]
jelastic/mysql                    An image of the MySQL database server mainta…   2                    
centos/mysql-80-centos7           MySQL 8.0 SQL database server                   2                    
widdpim/mysql-client              Dockerized MySQL Client (5.7) including Curl…   1                    [OK]

镜像的拉取也是像堆积木一样分层拉取的

# 如果拉取的时候不指定版本号,就默认拉取latest,也就是最新版本

[root@VM-20-13-centos dockerFile]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
6552179c3509: Downloading [========================>                          ]  13.09MB/27.15MB
d69aa66e4482: Download complete 
3b19465b002b: Download complete 
7b0d0cfe99a1: Download complete 
9ccd5a5c8987: Download complete 
2dab00d7d232: Download complete 
64d3afdccd4a: Download complete 
82148d50b16c: Download complete 
8bb7d73a7d0c: Download complete 
74778cd68a75: Download complete 
d7e5f9309140: Download complete 
f2e376ecd59f: Download complete

这里能看到mysql的下载是分成许多层级的,很多镜像的底层是能复用的,在拉取有相同底层的镜像时,只会下载服务器上还没有的层级。

结构如下:
在这里插入图片描述
在镜像拉取下来后,可以查看该镜像的启动步骤

# 查看镜像
[root@VM-20-13-centos dockerFile]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
mysql        latest    d1dc36cf8d9e   30 hours ago   519MB

这里可以看到拉取的mysql的镜像id

# 查看镜像启动步骤
[root@VM-20-13-centos dockerFile]# docker history d1dc36cf8d9e
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
d1dc36cf8d9e   30 hours ago   /bin/sh -c #(nop)  CMD ["mysqld"]               0B        
<missing>      30 hours ago   /bin/sh -c #(nop)  EXPOSE 3306 33060            0B        
<missing>      30 hours ago   /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry…   0B        
<missing>      30 hours ago   /bin/sh -c ln -s usr/local/bin/docker-entryp…   34B       
<missing>      30 hours ago   /bin/sh -c #(nop) COPY file:c112ec3a02a7b818…   13.2kB    
<missing>      30 hours ago   /bin/sh -c #(nop) COPY dir:2e040acc386ebd23b…   1.12kB    
<missing>      30 hours ago   /bin/sh -c #(nop)  VOLUME [/var/lib/mysql]      0B        
<missing>      30 hours ago   /bin/sh -c {   echo mysql-community-server m…   384MB     
<missing>      30 hours ago   /bin/sh -c echo 'deb http://repo.mysql.com/a…   55B       
<missing>      30 hours ago   /bin/sh -c #(nop)  ENV MYSQL_VERSION=8.0.28-…   0B        
<missing>      30 hours ago   /bin/sh -c #(nop)  ENV MYSQL_MAJOR=8.0          0B        
<missing>      30 hours ago   /bin/sh -c set -ex;  key='859BE8D7C586F53843…   2.29kB    
<missing>      30 hours ago   /bin/sh -c apt-get update && apt-get install…   52.2MB    
<missing>      30 hours ago   /bin/sh -c mkdir /docker-entrypoint-initdb.d    0B        
<missing>      30 hours ago   /bin/sh -c set -eux;  savedAptMark="$(apt-ma…   4.06MB    
<missing>      30 hours ago   /bin/sh -c #(nop)  ENV GOSU_VERSION=1.14        0B        
<missing>      30 hours ago   /bin/sh -c apt-get update && apt-get install…   9.34MB    
<missing>      30 hours ago   /bin/sh -c groupadd -r mysql && useradd -r -…   329kB     
<missing>      2 days ago     /bin/sh -c #(nop)  CMD ["bash"]                 0B        
<missing>      2 days ago     /bin/sh -c #(nop) ADD file:c51141702f568a28a…   69.3MB

镜像的查看命令

docker images "镜像id"

# 指令
  -a, --all             Show all images (default hides intermediate images)
      --digests         Show digests
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print images using a Go template
      --no-trunc        Don't truncate output
  -q, --quiet           Only show image IDs

镜像删除命令

docker rmi "镜像id"

# 遍历删除所有镜像
docker rmi $(docker images -aq)

2.2. 容器(container)

通过镜像可以创建容器,如果不知道指令可以后接–help查看详细的指令帮助

# 查看镜像id
[root@VM-20-13-centos dockerFile]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
mysql        latest    d1dc36cf8d9e   30 hours ago   519MB

# 通过镜像id来创建容器
[root@VM-20-13-centos ~]# docker run -it -d -p 3310:3306 -v /home/mysql/data:/var/lib/mysql -v /home/mysql/conf:/etc/mysql/conf.d  -e MYSQL_ROOT_PASSWORD=root  --name mysql01 mysql /bin/bash
ced783bcb3903dad9d87ba23559202383a4e8a28ef598c523321e1cc799a1805

# 指令解释
run 	# 创建容器
-it		# 交互式
-d		# 挂在后台
-p		# 端口映射,"宿主机端口":"容器端口"
-v 		# "宿主机目录":"容器目录",把容器目录挂载到宿主机目录
-e		# 环境变量
--name	# 重命名

# 查看容器
[root@VM-20-13-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
052af6f48f63   mysql     "docker-entrypoint.s…"   6 seconds ago   Up 5 seconds   33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp   mysql01

注意,交互式的时候需要指定/bin/bash,否则会因为检测不到引用而自动停止容器

容器的查看命令

docker ps [指令]

  -a, --all             Show all containers (default shows just running)
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print containers using a Go template
  -n, --last int        Show n last created containers (includes all states) (default -1)
  -l, --latest          Show the latest created container (includes all states)
      --no-trunc        Don't truncate output
  -q, --quiet           Only display container IDs
  -s, --size            Display total file sizes

容器的删除命令

[root@VM-20-13-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
052af6f48f63   mysql     "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes   33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp   mysql01
[root@VM-20-13-centos ~]# docker rm -f 052af6f48f63
052af6f48f63

3. 容器挂载

因为容器是与宿主机分离开来的不同环境,所以如果我们要查看容器内数据文件得进入容器内部,那能不能在宿主机就看到容器内部的数据文件?这就引出了挂载的概念。

把容器内的数据文件目录挂载到宿主机的某个目录上,就能实现我们的需要。
在这里插入图片描述
挂载分为具名挂载和匿名挂载

  • 具名挂载:是对容器挂载出来的目录进行指定和命名,如果没有创建宿主机的目录,那进行挂载的时候将会自动进行创建
  • 匿名挂载:不指定宿主机目录,则会进行随机分配

挂载时也能指定ro:只读,rw:只写

刚刚在创建mysql容器时使用了指令“-v /home/mysql/data:/var/lib/mysql -v /home/mysql/conf:/etc/mysql/conf.d”,这就是一种具名挂载,把数据库中的/var/lib/mysql挂载到宿主机的/home/mysql/data上

这时我们进入容器
进入容器可以使用attach指令或exec指令

[root@VM-20-13-centos ~]# docker exec -it f61777d622a7 /bin/bash
root@f61777d622a7:/# 

查看容器内
在这里插入图片描述
查看宿主机
在这里插入图片描述
可以看到这两个环境的内容同步,此时就算容器关闭,在宿主机上更新,容器再启动时也会保持环境的同步

那么匿名挂载呢
我们可以重新启动一个容器,不指定宿主机目录

# 通过docker inspect可以查看容器的元数据,这时我们可以看看里面的mounts,也就是挂载

[root@VM-20-13-centos ~]# docker run -d -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql02 mysql
49b07b06cacd946ac62d2f5655ea3f5513c9762dedafd2338062316f1410ed76
[root@VM-20-13-centos ~]# docker inspect 49b07b06cacd946ac62d2f5655ea3f5513c9762dedafd2338062316f1410ed76
[
        "Mounts": [
            {
                "Type": "volume",
                "Name": "96a7585aede4fd5870c84a9acdba0d8596123433385775a0e55b07236b89b2e2",
                "Source": "/var/lib/docker/volumes/96a7585aede4fd5870c84a9acdba0d8596123433385775a0e55b07236b89b2e2/_data",
                "Destination": "/etc/mysql/conf.d",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "d3959a74b3863d1a253eef685d9cfb5edae72fa27bce2b6009d2ceac2f511f14",
                "Source": "/var/lib/docker/volumes/d3959a74b3863d1a253eef685d9cfb5edae72fa27bce2b6009d2ceac2f511f14/_data",
                "Destination": "/var/lib/mysql",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ]
]

可以看到Destination就是容器数据目录,Source就是匿名挂载在宿主机上的目录,默认会存放在"/var/lib/docker/volumes/xxx/_data"下

4. DockerFile

镜像不止能够从docker hub拉取,也能由我们自己制作DockerFile来生成

因为docker hub拉取的镜像,每个层级都只存有最小保证运行的东西

在这里插入图片描述

像我们拉取的centos,没有vim命令,也没有ifconfig命令等等,就是个精简版的centos,这样肯定不能满足我们的需求,那此时我们就可以通过自己编写dockerFile来自定义要的镜像

创建一个文件,我这里随便命名为dockerFile01

# dockerFile01 内容
FROM centos
MAINTAINER  Ray<Ray@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "----end----"
CMD "/bin/bash"

# 解释
# dockerFile的命令要大写
# FROM 				基本镜像
# MAINTAINER		作者信息
# ENV				环境变量
# WORKDIR			默认工作目录
# RUN				执行的操作
# ADD				添加的其他资源,可以添加压缩包,压缩包将会自动解压,一般解压在/usr/local/目录下
# EXPOSE			暴露的端口
# CMD				当容器启动后,使用cmd命令做点什么,是不可追加命令的,如果在容器启动的时候追加命令,可能会覆盖CMD的命令
# ENTRYPOINT		可追加的CMD

创建镜像

[root@VM-20-13-centos dockerFile]# docker build -f dockerFile01 -t raydockerfile:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/10 : FROM centos
 ---> 5d0da3dc9764
Step 2/10 : MAINTAINER  Ray<Ray@qq.com>
 ---> Running in 4d39e00b98eb
Removing intermediate container 4d39e00b98eb
 ---> b32e0b9c06c7
Step 3/10 : ENV MYPATH /usr/local
 ---> Running in 958494464f74
Removing intermediate container 958494464f74
 ---> f7a0a74dbab0
Step 4/10 : WORKDIR $MYPATH
 ---> Running in bf90c1aee237
Removing intermediate container bf90c1aee237
 ---> 3485e72a1a1e
Step 5/10 : RUN yum -y install vim
 ---> Running in a49a51a4fa5a
CentOS Linux 8 - AppStream                      8.9 MB/s | 8.4 MB     00:00

# 解释
# -f 指定dockerFile文件名
# -t 指定创建出来的镜像名

此时查看镜像,就会有我们创建的镜像了

[root@VM-20-13-centos dockerFile]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
raydockerfile   1.0       e9e873baead7   2 minutes ago   326MB
mysql           latest    d1dc36cf8d9e   33 hours ago    519MB
centos          latest    5d0da3dc9764   4 months ago    231MB

5. 镜像上传

我们自己创建的镜像也能上传,前提是需要有docker hub的账户

[root@VM-20-13-centos dockerFile]# docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username

登录后

[root@VM-20-13-centos dockerFile]# docker push raydockerfile:1.0 
The push refers to repository [docker.io/library/raydockerfile]
10f82b83df02: Preparing 
433df634a1ed: Preparing 
74ddd0ec08fa: Preparing 
denied: requested access to the resource is denied

# 提交失败,需要先对镜像进行改名,把前缀改成账户昵称/镜像名就可以了
# 我的账户昵称是uprayup
[root@VM-20-13-centos dockerFile]# docker tag e9e873baead7 uprayup/raydockerfile:1.0
[root@VM-20-13-centos dockerFile]# docker images
REPOSITORY              TAG       IMAGE ID       CREATED         SIZE
raydockerfile           1.0       e9e873baead7   9 minutes ago   326MB
uprayup/raydockerfile   1.0       e9e873baead7   9 minutes ago   326MB
mysql                   latest    d1dc36cf8d9e   33 hours ago    519MB
centos                  latest    5d0da3dc9764   4 months ago    231MB
[root@VM-20-13-centos dockerFile]# docker push uprayup/raydockerfile:1.0
The push refers to repository [docker.io/uprayup/raydockerfile]
10f82b83df02: Pushed 
433df634a1ed: Pushed 
74ddd0ec08fa: Pushed 
1.0: digest: sha256:76fe432b8e9041317324826b545bfef87c9613ebf1fd298a49dbdd273699975c size: 953

这样在docker hub就能看到自己制作的镜像文件了
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值