一、Docker简介
Docker 是一个开源的应用容器引擎,基于Go 语言并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)更重要的是容器性能开销极低。
Docker支持将软件编译成镜像;在镜像中支持各种软件配置好并发布,其他使用者可以直接使用配置好的镜像。运行中的镜像称之为容器,容器启动速度很快。类似于封装好的Windows系统,通过U盘直接安装即可,不需要进行系统配置软件。
Docker的应用场景:
- Web应用的自动化打包发布;
- 自动化测试和持续集成、发布;
- 在服务型环境中部署调整数据库或其他的后台应用;
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
Docker的优点:
- 快速、一致性的交付应用程序
- 响应式部署和扩展
- 充分利用虚拟机资源
二、Docker核心概念
Docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统中)
Docker客户端(Client):连接Docker主机进行操作;
Docker容器(Container):镜像启动后的实例,独立运行的一个或一组应用;
Docker镜像(Image):打包好的软件,用于创建Docker容器的模板;
Docker仓库(Respository):用于保存打包好的软件镜像;
关系示意图:
Docker的基本使用方式:
① 在机器中安装Docker;
② 在Docker仓库中寻找这个软件对应的镜像;
③ 使用Docker运行镜像,生成一个Docker容器;
④ 容器的启动或停止相当于对软件的启动和停止;
三、Docker安装
在Linux中安装Docker的步骤
1.检查Linux内核版本,必须是3.10以上
uname -r
若Linux版本内核不符合则需要升级软件包和内核
yum update
2.安装docker
yum install docker
3.查看docker是否安装成功
docker -v
4.启动docker容器
systemctl start docker
5.设置docker开机启用
systemctl enable docker
6.停止docker
systemctl stop docker
设置docker使用阿里云镜像加速
访问阿里云镜像加速器网址 :阿里云镜像加速
四、Docker常用操作
1. 镜像操作
1.1 操作远程镜像
① 查询远程仓库镜像
docker search [OPTIONS]
OPTIONS说明:
-
--automated
:只列出 automated build类型的镜像; -
--no-trunc
:显示完整的镜像描述; -
-s
:列出收藏数不小于指定值的镜像。
查询docker远程仓库中的MySQL
[root@izuf6h7blj36dmxbmcj15wz ~]# docker search mysql
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/mysql MySQL is a widely used, open-source relati... 10111 [OK]
docker.io docker.io/mariadb MariaDB is a community-developed fork of M... 3711 [OK]
docker.io docker.io/mysql/mysql-server Optimized MySQL Server Docker images. Crea... 738 [OK]
docker.io docker.io/percona Percona Server is a fork of the MySQL rela... 511 [OK]
docker.io docker.io/centos/mysql-57-centos7 MySQL 5.7 SQL database server 84
docker.io docker.io/mysql/mysql-cluster Experimental MySQL Cluster Docker images. ... 77
docker.io docker.io/centurylink/mysql Image containing mysql. Optimized to be li... 60 [OK]
docker.io docker.io/bitnami/mysql Bitnami MySQL Docker Image 45 [OK]
docker.io docker.io/deitch/mysql-backup REPLACED! Please use http://hub.docker.com... 41 [OK]
......
② 拉取远程仓库中的镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
OPTIONS说明:
-
-a
:拉取所有 tagged 镜像 -
--disable-content-trust
:忽略镜像的校验,默认开启 -
TAG
:用于指定版本号
拉取tomcat 7.0镜像
[root@izuf6h7blj36dmxbmcj15wz ~]# docker pull tomcat:7.0
Trying to pull repository docker.io/library/tomcat ...
7.0: Pulling from docker.io/library/tomcat
e4c3d3e4f7b0: Pull complete
101c41d0463b: Pull complete
8275efcd805f: Pull complete
751620502a7a: Pull complete
a59da3a7d0e7: Pull complete
5ad32ac1e527: Pull complete
27c13473e3bd: Pull complete
717370f5d395: Pull complete
84d544041c3b: Pull complete
4cce74688a50: Pull complete
Digest: sha256:9c86a5a1af6f7bdc946a28a39b7f05044abd5eee2eb8cf56b55938c8618c85cb
Status: Downloaded newer image for docker.io/tomcat:7.0
docker官方镜像仓库 Docker官方镜像仓库中会介绍使用方法,可以按照官方文档的说明进行操作。
1.2 管理本地镜像
① 查看本地镜像列表
docker images [OPTIONS] [REPOSITORY[:TAG]]
OPTIONS说明:
-
-a
:列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层); -
--digests
:显示镜像的摘要信息; -
f
:显示满足条件的镜像; -
--format
:指定返回值的模板文件; -
--no-trunc
:显示完整的镜像信息; -
-q
:只显示镜像ID。
查看本地仓库的镜像
[root@izuf6h7blj36dmxbmcj15wz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/memcached latest 804901da629f 38 hours ago 82.3 MB
docker.io/tomcat 7.0 ae42daf81b8c 2 days ago 533 MB
docker.io/mysql 5.7.32 1b12f2e9257b 6 days ago 448 MB
② 删除本地镜像列表
docker rmi [OPTIONS] IMAGE [IMAGE...]
OPTIONS说明:
-
-f
:强制删除; -
--no-prune
:不移除该镜像的过程镜像,默认移除;
删除本地仓库中的tomcat
[root@izuf6h7blj36dmxbmcj15wz ~]# docker rmi tomcat:7.0
Untagged: tomcat:7.0
Untagged: docker.io/tomcat@sha256:9c86a5a1af6f7bdc946a28a39b7f05044abd5eee2eb8cf56b55938c8618c85cb
Deleted: sha256:ae42daf81b8c5fd4b2f009d277d062681171d8d84c9f174aba08f6dbd47ed857
Deleted: sha256:3f394bd52132d1cf758651758ac12ebf02b721921b524123ead1e874a1ed9bd6
Deleted: sha256:1174c29e4d812f6dd04484ae909d5c4451fc7d4ecb8cd0934930876ad68985de
Deleted: sha256:24fdd84b4adf4b922767e2b9d336c96fb31cab90c84fb34f9164f6587473e565
Deleted: sha256:984e8d35fe94a287a0bc4a45e8757c75e17e80c3f4fed0b9f9b0ec6b4b457ebb
Deleted: sha256:254cf71da09bbc16e304f925dee4270ac9069649dee8576423a6a77186ee0061
Deleted: sha256:3383e45b22b2b665b1a2604e375c1e7dc007c540e77d6367b1d7ba79ef0030d8
Deleted: sha256:d5d618196ec30fcdba1d210f135b4911b9dbdc79fdd729a9a9c3683a6a9b9308
Deleted: sha256:4bb57adf9037e4da45f2dbc0f84a7e9d8da6847bef3e63d09c8a9d8465f4d2c6
Deleted: sha256:5173011923d00f0fe606ecceda93ea88f17dc77e0b026df802c9aeb31bc1eac6
Deleted: sha256:9780f6d83e45878749497a6297ed9906c19ee0cc48cc88dc63827564bb8768fd
[root@izuf6h7blj36dmxbmcj15wz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/memcached latest 804901da629f 38 hours ago 82.3 MB
docker.io/mysql 5.7.32 1b12f2e9257b 6 days ago 448 MB
2. 容器操作
2.1 容器生命周期管理
① 创建一个容器并运行命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明:
-
-a stdin
: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项; -
-d
: 后台运行容器,并返回容器ID; -
-i
: 以交互模式运行容器,通常与 -t 同时使用; -
-P
: 随机端口映射,容器内部端口随机映射到主机的端口 -
-p
: 指定端口映射,格式为:主机(宿主)端口:容器端口 -
-t
: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; -
--name="nginx-lb"
: 为容器指定一个名称; -
--dns 8.8.8.8
: 指定容器使用的DNS服务器,默认和宿主一致; -
--dns-search example.com
: 指定容器DNS搜索域名,默认和宿主一致; -
-h "mars"
: 指定容器的hostname; -
-e username="ritchie"
: 设置环境变量; -
--env-file=[]
: 从指定文件读入环境变量; -
--cpuset="0-2" or --cpuset="0,1,2"
: 绑定容器到指定CPU运行; -
-m
:设置容器使用内存最大值; -
--net="bridge"
: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型; -
--link=[]
: 添加链接到另一个容器; -
--expose=[]
: 开放一个端口或一组端口; -
--volume , -v
: 绑定一个卷
Docker可以通过一个镜像创建多个容器,各个容器之间互不干扰,可以同时运行
② 启动、停止、刷新容器
docker start [OPTIONS] CONTAINER [CONTAINER...]
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker restart [OPTIONS] CONTAINER [CONTAINER...]
启动已被停止的容器mysql01
[root@izuf6h7blj36dmxbmcj15wz ~]# docker start mysql01
停止运行中的容器mysql01
[root@izuf6h7blj36dmxbmcj15wz ~]# docker stop mysql01
重启容器mysql01shell
[root@izuf6h7blj36dmxbmcj15wz ~]# docker restart mysql01
③ 删除容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS说明:
-
-f
:通过 SIGKILL 信号强制删除一个运行中的容器。 -
-l
:移除容器间的网络连接,而非容器本身。 -
-v
:删除与容器关联的卷。
④ 创建容器但不启动
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
语法类似与run的语法
⑤ 在运行的容器中执行命令
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS说明:
-
-d
:分离模式: 在后台运行 -
-i
:即使没有附加也保持STDIN 打开 -
-t
:分配一个伪终端
进入到MySQL中操作
[root@izuf6h7blj36dmxbmcj15wz ~]# docker exec -it mysql-test /bin/bash
root@86afbc58bd27:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 5.7.32 MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
2.2 容器管理
① 列出所有容器
docker ps [OPTIONS]
OPTIONS说明:
-
-a
:显示所有的容器,包括未运行的。 -
-f
:根据条件过滤显示的内容。 -
--format
:指定返回值的模板文件。 -
-l
:显示最近创建的容器。 -
-n
:列出最近创建的n个容器。 -
--no-trunc
:不截断输出。 -
-q
:静默模式,只显示容器编号。 -
-s
:显示总的文件大小。
② 查看容器运行日志
docker logs [OPTIONS] CONTAINER
OPTIONS说明:
-
-f
: 跟踪日志输出 -
--since
:显示某个开始时间的所有日志 -
-t
: 显示时间戳 -
--tail
:仅列出最新N条容器日志
查看tomcat运行日志
[root@izuf6h7blj36dmxbmcj15wz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b88d05801048 tomcat:9.0.39 "catalina.sh run" 17 minutes ago Up 10 minutes 0.0.0.0:8090->8080/tcp tomcat9.0
f7d14d73ec4a memcached "docker-entrypoint..." 5 days ago Up 5 days 0.0.0.0:11211->11211/tcp memcache
86afbc58bd27 mysql:5.7.32 "docker-entrypoint..." 5 days ago Up 5 days 0.0.0.0:3306->3306/tcp, 33060/tcp mysql-test
[root@izuf6h7blj36dmxbmcj15wz ~]# docker logs tomcat9.0
2020-11-03T01:45:26.595757000Z 03-Nov-2020 01:45:26.593 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home: /usr/local/openjdk-11
2020-11-03T01:45:26.595845000Z 03-Nov-2020 01:45:26.593 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version: 11.0.9+11
2020-11-03T01:45:26.595933000Z 03-Nov-2020 01:45:26.593 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor: Oracle Corporation
2020-11-03T01:45:26.596033000Z 03-Nov-2020 01:45:26.593 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: /usr/local/tomcat
2020-11-03T01:45:26.605849000Z 03-Nov-2020 01:45:26.600 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: /usr/local/tomcat
2020-11-03T01:45:26.636942000Z 03-Nov-2020 01:45:26.634 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED
2020-11-03T01:45:26.637118000Z 03-Nov-2020 01:45:26.634 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.io=ALL-UNNAMED
2020-11-03T01:45:26.637215000Z 03-Nov-2020 01:45:26.634 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
2020-11-03T01:45:26.637307000Z 03-Nov-2020 01:45:26.634 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties
2020-11-03T01:45:26.637411000Z 03-Nov-2020 01:45:26.634 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
2020-11-03T01:45:26.637510000Z 03-Nov-2020 01:45:26.634 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
2020-11-03T01:45:26.637603000Z 03-Nov-2020 01:45:26.634 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
2020-11-03T01:45:26.637691000Z 03-Nov-2020 01:45:26.634 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0027
2020-11-03T01:45:26.637780000Z 03-Nov-2020 01:45:26.635 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs=
2020-11-03T01:45:26.637897000Z 03-Nov-2020 01:45:26.635 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/usr/local/tomcat
2020-11-03T01:45:26.638002000Z 03-Nov-2020 01:45:26.635 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/usr/local/tomcat
2020-11-03T01:45:26.638094000Z 03-Nov-2020 01:45:26.635 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
2020-11-03T01:45:26.654483000Z 03-Nov-2020 01:45:26.652 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [1.2.25] using APR version [1.6.5].
......
查看全部容器
[root@izuf6h7blj36dmxbmcj15wz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7d14d73ec4a memcached "docker-entrypoint..." 43 hours ago Up 43 hours 0.0.0.0:11211->11211/tcp memcache
86afbc58bd27 mysql:5.7.32 "docker-entrypoint..." 46 hours ago Up 45 hours 0.0.0.0:3306->3306/tcp, 33060/tcp mysql-test
docker操作命令:Docker 命令大全
3. 安装MySQL
① 查询远程MySQL镜像
[root@izuf6h7blj36dmxbmcj15wz ~]# docker search mysql
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/mysql MySQL is a widely used, open-source relati... 10111 [OK]
docker.io docker.io/mariadb MariaDB is a community-developed fork of M... 3711 [OK]
docker.io docker.io/mysql/mysql-server Optimized MySQL Server Docker images. Crea... 739 [OK]
docker.io docker.io/percona Percona Server is a fork of the MySQL rela... 511 [OK]
docker.io docker.io/centos/mysql-57-centos7 MySQL 5.7 SQL database server 84
docker.io docker.io/mysql/mysql-cluster Experimental MySQL Cluster Docker images. ... 77
docker.io docker.io/centurylink/mysql Image containing mysql. Optimized to be li... 60 [OK]
docker.io docker.io/bitnami/mysql Bitnami MySQL Docker Image 45 [OK]
docker.io docker.io/deitch/mysql-backup REPLACED! Please use http://hub.docker.com... 41 [OK]
docker.io docker.io/tutum/mysql Base docker image to run a MySQL database ... 35
docker.io docker.io/databack/mysql-backup Back up mysql databases to... anywhere! 31
docker.io docker.io/prom/mysqld-exporter 31 [OK]
docker.io docker.io/schickling/mysql-backup-s3 Backup MySQL to S3 (supports periodic back... 29 [OK]
docker.io docker.io/linuxserver/mysql A Mysql container, brought to you by Linux... 26
docker.io docker.io/centos/mysql-56-centos7 MySQL 5.6 SQL database server 20
docker.io docker.io/circleci/mysql MySQL is a widely used, open-source relati... 19
docker.io docker.io/mysql/mysql-router MySQL Router provides transparent routing ... 17
docker.io docker.io/arey/mysql-client Run a MySQL client from a docker container 15 [OK]
docker.io docker.io/fradelg/mysql-cron-backup MySQL/MariaDB database backup using cron t... 10 [OK]
docker.io docker.io/openshift/mysql-55-centos7 DEPRECATED: A Centos7 based MySQL v5.5 ima... 6
docker.io docker.io/devilbox/mysql Retagged MySQL, MariaDB and PerconaDB offi... 3
docker.io docker.io/ansibleplaybookbundle/mysql-apb An APB which deploys RHSCL MySQL 2 [OK]
docker.io docker.io/jelastic/mysql An image of the MySQL database server main... 1
docker.io docker.io/widdpim/mysql-client Dockerized MySQL Client (5.7) including Cu... 1 [OK]
docker.io docker.io/monasca/mysql-init A minimal decoupled init container for mysql 0
② 拉取MySQL镜像
可以指定安装镜像的版本号,如果不指定的话默认拉取最新的版本
[root@izuf6h7blj36dmxbmcj15wz ~]# docker pull mysql
Using default tag: latest
Trying to pull repository docker.io/library/mysql ...
latest: Pulling from docker.io/library/mysql
bb79b6b2107f: Already exists
49e22f6fb9f7: Already exists
842b1255668c: Already exists
9f48d1f43000: Already exists
c693f0615bce: Already exists
8a621b9dbed2: Already exists
0807d32aef13: Already exists
a56aca0feb17: Pull complete
de9d45fd0f07: Pull complete
1d68a49161cc: Pull complete
d16d318b774e: Pull complete
49e112c55976: Pull complete
Digest: sha256:8c17271df53ee3b843d6e16d46cff13f22c9c04d6982eb15a9a47bd5c9ac7e2d
Status: Downloaded newer image for docker.io/mysql:latest
查看已经获取的本地镜像仓库
[root@izuf6h7blj36dmxbmcj15wz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/memcached latest 804901da629f 2 days ago 82.3 MB
docker.io/mysql 5.7.32 1b12f2e9257b 7 days ago 448 MB
docker.io/mysql latest db2b37ec6181 7 days ago 545 MB
③ 创建并运行MySQL容器
[root@izuf6h7blj36dmxbmcj15wz ~]# docker run --name=mysql-test -it -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.32
[root@izuf6h7blj36dmxbmcj15wz ~]# 86afbc58bd27
--name
:指定容器名称
-it
:创建终端并以交互模式运行容器
-p
:指定端口映射格式为 主机(宿主)端口:容器端口
-e
:设置环境变量
-d
:后台运行容器,并返回ID
④ 查看正在运行的容器
[root@izuf6h7blj36dmxbmcj15wz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7d14d73ec4a memcached "docker-entrypoint..." 45 hours ago Up 45 hours 0.0.0.0:11211->11211/tcp memcache
86afbc58bd27 mysql:5.7.32 "docker-entrypoint..." 47 hours ago Up 47 hours 0.0.0.0:3306->3306/tcp, 33060/tcp mysql-test
⑤ 进入MySQL容器操作
[root@izuf6h7blj36dmxbmcj15wz ~]# docker exec -it mysql-test /bin/bash
root@86afbc58bd27:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 28
Server version: 5.7.32 MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
参考文献
若在云服务中操作,注意打开服务器3306端口
在服务器中部署完成后使用navicat客户端连接
使用Docker安装其他的镜像与安装MySQL操作基本相似,恭喜你学会了Docker操作