docker学习文档
1、什么是docker
百度百科:docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或者Windows机器上,也可以实现虚拟化。
docker三个重要的概念Dockerfile、镜像image、容器container
2、Dockerfile
Dockerfile是用来构建Docker镜像的构建文件,是由一系列的命令和参数构成的脚本。
Dockerfile体系结构
FROM #基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER #镜像维护者的姓名和邮箱地址
RUN #容器构建时需要运行的命令,<命令行命令> 等同于,在终端操作的 shell 命令。
EXPOSE #当前容器对外暴露出的端口
WORKDIR #指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
ENV #用来在构建镜像过程中设置环境变量
ADD #将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY #类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
VOLUME #容器数据卷,用于数据保存和持久化工作
CMD #指定一个容器启动时要运行的命令。Dockerfile中可以有多个CMD指令,但只要最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT #指定一个容器启动时要运行的命令。ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数
ONBUILD #当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
3、镜像image
镜像是一种轻量级的、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
展示所有镜像
E:\docker_test>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat-test latest 5324eb51e988 3 hours ago 327MB
mysql 5.6 0ebb5600241d 8 days ago 302MB
afen139docker/mydocker test b7a9950157d4 12 days ago 159MB
friendlyhello latest b7a9950157d4 12 days ago 159MB
ubuntu latest f643c72bc252 4 weeks ago 72.9MB
hello-world latest bf756fb1ae65 12 months ago 13.3kB
microsoft/dotnet-samples aspnetapp 575d85b4a69b 22 months ago 263MB
tomcat 9.0.0.M15 d8a27fa137dc 3 years ago 335MB
搜索镜像
E:\docker_test>docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10326 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3825 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 754 [OK]
percona Percona Server is a fork of the MySQL relati… 518 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 86
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 79
centurylink/mysql Image containing mysql. Optimized to be link… 60 [OK]
bitnami/mysql Bitnami MySQL Docker Image 47 [OK]
deitch/mysql-backup REPLACED! Please use http://hub.docker.com/r… 41 [OK]
tutum/mysql Base docker image to run a MySQL database se… 35
databack/mysql-backup Back up mysql databases to... anywhere! 34
prom/mysqld-exporter 33 [OK]
schickling/mysql-backup-s3 Backup MySQL to S3 (supports periodic backup… 29 [OK]
拉取镜像
docker pull 镜像名:版本号(没有版本号即拉取最新的)
E:\docker_test>docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
6ec7b7d162b2: Pull complete
fedd960d3481: Pull complete
7ab947313861: Pull complete
64f92f19e638: Pull complete
3e80b17bff96: Pull complete
014e976799f9: Pull complete
59ae84fee1b3: Pull complete
ffe10de703ea: Pull complete
657af6d90c83: Downloading [===============================> ] 71.21MB/112.8MB
98bfb480322c: Download complete
6aa3859c4789: Download complete
1ed875d851ef: Download complete
删除镜像
docker rmi 文件名/ID
E:\docker_test>docker rmi 5324eb51e988
E:\docker_test>docker rmi mysql:latest
构建个人镜像
创建Dockerfile文件并编辑:
FROM tomcat:9.0.0.M15 #基础镜像为tomcat:9.0.0.M15
MAINTAINER huangbin <huangbin139email@163.com> #指定作者及邮箱
COPY behavior.war /usr/local/tomcat/webapps #将当前目录下的war包复制到/usr/local/tomcat/webapps目录下
RUN echo "Asia/Shanghai" > /etc/timezone #指定时区为上海
打开命令窗口构造镜像:
docker build -t tomcat_demo:v1 .
tomcat_demo:v1 #镜像名:标签(可理解为版本号)
. #文件路径,说明构造镜像所需的文件在当前文件夹下
E:\docker_Dockerfile\docker_mysql>docker build -t tomcat_demo:v1 .
[+] Building 0.7s (7/8)
[+] Building 0.8s (7/8)
[+] Building 0.9s (7/8)
[+] Building 1.0s (8/8) FINISHED 0.1s
=> naming to docker.io/library/tomcat_demo:v1
4、容器container
容器是用镜像创建的示例。它可以被启动、开始、停止、删除。每个容器都是互相隔离的、保证安全的平台。可以把容器看作简易版的Linux系统(包括root用户权限、用户空间和网络空间等等)和运行在其中的应用程序。
使用镜像启动一个容器
E:\docker_test>docker run -it ubuntu /bin/bash
root@22b9b9bf6c02:/#
-i:交互式操作;
-t:终端;
ubuntu:镜像;
/bin/bash:放在镜像后面是命令,这里我们希望有个交互式Shell,因此用的是/bin/bash,故命令运行完成后进入镜像终端。
使用tomcat镜像启动一个tomcat容器
E:\docker_test>docker run --name tomcat_MT -d -p 8081:8080 tomcat:9.0.0.M15
6788350eed1a1704a9bc65fab9dc2cfed7a54577cbfcd24e583454432303a97e
启动镜像并和某个启动的容器链接
docker run -d -p 8090:8080 --name behavior_test02 --link mysql_container:mysql docker_behavior:v2
启动mysql镜像
docker run -d -p 3306:3306 --name mysql_container -e MYSQL_ROOT_PASSWORD=PASSWORD mysql:v1
查看结果
E:\docker_test>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6788350eed1a tomcat:9.0.0.M15 "catalina.sh run" 30 seconds ago Up 29 seconds 0.0.0.0:8081->8080/tcp tomcat_MT
查看正在运行的容器
E:\docker_test>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6788350eed1a tomcat:9.0.0.M15 "catalina.sh run" 4 minutes ago Up 4 minutes 0.0.0.0:8081->8080/tcp tomcat_MT
查看所有容器
E:\docker_test>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6788350eed1a tomcat:9.0.0.M15 "catalina.sh run" 2 hours ago Up 2 hours 0.0.0.0:8081->8080/tcp tomcat_MT
22b9b9bf6c02 ubuntu "/bin/bash" 2 hours ago Exited (0) 2 hours ago nervous_ardinghelli
4c751ccc724c mysql:5.6 "docker-entrypoint.s…" 6 days ago Exited (0) About an hour ago mysql_container
3877f1ec03dd tomcat:9.0.0.M15 "catalina.sh run" 8 days ago Exited (143) 5 days ago tomcat_M15
dcefb334e324 afen139docker/mydocker:test "python app.py" 12 days ago Exited (137) 12 days ago brave_wing
30e3b74df6b2 friendlyhello "python app.py" 12 days ago Exited (137) 12 days ago stoic_chaum
b2fb618fb12d ubuntu "bash" 2 weeks ago Exited (0) 2 weeks ago sleepy_kare
0503f60967fe hello-world "/hello" 2 weeks ago Exited (0) 2 weeks ago naughty_agnesi
3a4ef941bc1d hello-world "/hello" 3 weeks ago Exited (0) 3 weeks ago stoic_wu
启动容器
docker start
E:\docker_test>docker start 4c751ccc724c
4c751ccc724c
停止容器
docker stop
E:\docker_test>docker stop 4c751ccc724c
4c751ccc724c
删除容器
docker rm
E:\docker_test>docker rm 6788350eed1a
6788350eed1a
重启容器
docker restart
E:\docker_test>docker restart 4c751ccc724c
4c751ccc724c
进入容器(tomcat)
E:\docker_test>docker exec -it 3877f1ec03dd /bin/bash
E:\docker_test>docker exec -it 3877f1ec03dd /bin/bash
root@3877f1ec03dd:/usr/local/tomcat# ls -l
total 120
-rw-r----- 1 root root 57092 Dec 5 2016 LICENSE
-rw-r----- 1 root root 1804 Dec 5 2016 NOTICE
-rw-r----- 1 root root 6709 Dec 5 2016 RELEASE-NOTES
-rw-r----- 1 root root 15946 Dec 5 2016 RUNNING.txt
drwxr-x--- 2 root root 4096 Jan 17 2017 bin
drwx--S--- 1 root root 4096 Dec 22 00:47 conf
drwxr-sr-x 3 root staff 4096 Jan 17 2017 include
drwxr-x--- 2 root root 4096 Jan 17 2017 lib
drwxr-x--- 1 root root 4096 Dec 30 11:05 logs
drwxr-sr-x 3 root staff 4096 Jan 17 2017 native-jni-lib
drwxr-x--- 2 root root 4096 Jan 17 2017 temp
drwxr-x--- 7 root root 4096 Dec 5 2016 webapps
drwxr-x--- 1 root root 4096 Dec 22 00:47 work
root@3877f1ec03dd:/usr/local/tomcat#
导出容器
docker export > 目录及文件名
docker export 3877f1ec03dd > ./docker/tomcat.tar
解释:将ID为3877f1ec03dd的容器导出到当前文件夹的docker文件夹下,且文件名为tomcat.tar
导入容器
widows:
type 目录/文件 | docker import - 容器名:版本号
linux:
cat 目录/文件 | docker import - 容器名:版本号
E:\docker_test>type tomcat.tar | docker import - tomcat-test
sha256:5324eb51e988d25244d0d249f69e4cf5fd16cd2515944020afc9864841f08238
E:\docker_test>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4c751ccc724c mysql:5.6 "docker-entrypoint.s…" 6 days ago Up 2 hours 0.0.0.0:3307->3306/tcp mysql_container
3877f1ec03dd tomcat:9.0.0.M15 "catalina.sh run" 8 days ago Exited (143) 5 days ago tomcat_M15
dcefb334e324 afen139docker/mydocker:test "python app.py" 12 days ago Exited (137) 12 days ago brave_wing
30e3b74df6b2 friendlyhello "python app.py" 12 days ago Exited (137) 12 days ago stoic_chaum
b2fb618fb12d ubuntu "bash" 2 weeks ago Exited (0) 2 weeks ago sleepy_kare
0503f60967fe hello-world "/hello" 2 weeks ago Exited (0) 2 weeks ago naughty_agnesi
3a4ef941bc1d hello-world "/hello" 3 weeks ago Exited (0) 3 weeks ago stoic_wu
5、docker 仓库管理
5.1 将镜像上传到个人仓库
标记镜像
docker tag mysql_demo:v7 afen139docker/mysql_test:1.0
推送镜像
docker push afen139docker/mysql_test:1.0
登录docker.hub查看镜像
5.2 从个人仓库拉取镜像
docker pull afen139docker/mysql_test:1.0
6 docker-compose 服务
使用docker-compose启动spring boot和mysql等多服务
创建docker-compose.yml文件并编辑:
version: '3' #版本号
services: #需要启动的服务
mysql: #启动的服务名称
image: afen139docker/mysql_test:1.0 #启动的镜像,若镜像不在本地会自动去仓库拉取
container_name: mysql #容器的名称
ports: #映射的端口号
- "3360:3306" #将容器的3306端口映射到宿主机3360上,可以通过访问宿主机3360端口从而访问容器
command: [ #启动镜像需要运行的命令
'--character-set-server=utf8mb4', #设置字符编码
'--collation-server=utf8mb4_unicode_ci', #设置储存方式
'--default-time-zone=+8:00' #将默认时间加8个小时
]
environment: #设置环境
MYSQL_DATABASE: lg_behavior #设置使用的数据库
MYSQL_ROOT_PASSWORD: root #设置数据库root用户的密码
MYSQL_ROOT_HOST: '%' #设置所有IP地址都可以使用该账号连接数据库,可以改为特定的IP地址或网段
restart: always #容器总是重启
networks: #配置容器连接的网络
- net-behavior-mysql
behavior: #启动的服务名称
image: afen139docker/behavior_demo:1.0 #启动的镜像
container_name: behavior_test01 #容器的名称
ports: #映射的端口号
- "8088:8080"
volumes: #将宿主机的数据卷挂载到容器中,可以通过此方法实现将日志以及配置文件同步到宿主机
- D:\behavior\logs\log:/usr/local/logs/log #宿主机和容器目录间的映射
depends_on: #说明服务依赖于那个服务,在当前服务启动前先启动依赖服务
- mysql
links: #建立容器间的连接
- "mysql"
restart: always #容器总是重启
networks: #配置容器连接的网络
- net-behavior-mysql
environment: #设置环境
- TZ=Asia/Shanghai
networks: #配置网络
net-behavior-mysql:
driver: bridge
打开命令窗口,启动多服务:
docker-compose up #实时显示日志
docker-compose up -d #后台运行,不显示日志
E:\docker_compose\compose_demo02>docker-compose up
Creating network "compose_demo02_net-behavior-mysql" with driver "bridge"
Pulling mysql (afen139docker/mysql_test:1.0)...
1.0: Pulling from afen139docker/mysql_test