是什么
docker是linux容器的一种封装,提供简单易用的容器使用接口。它是最流行的Linux容器解决方案。
docker的接口相当简单,用户可以方便的创建、销毁容器。
docker将应用程序与程序的依赖,打包在一个文件里面。运行这个文件就会生成一个虚拟容器。
程序运行在虚拟容器里,如同在真实物理机上运行一样,有了docker,就不用担心环境问题了

核心概念
镜像,容器,仓库
镜像images
Docker镜像是用于创建Docker容器的模板
容器Container
容器是独立运行的一个或一组应用
启动、停止、删除。
仓库Registy
Docker仓库用来保存镜像
- 公有仓库
- 私有仓库
可以做什么
虚拟机技术
- 资源占用
- 冗余步骤
- 启动慢
Docker
容器化技术
- 传统虚拟机,虚拟一个硬件。
- 每个容器互相隔离。每个容器都有一个自己的文件系统。互不影响

安装


下载
Docker镜像https://hub.daocloud.io/
Linux
本机环境
[root@linis_server ~]# uname -r3.10.0-1062.9.1.el7.x86_64
安装
CenterOS
yum install docker
systemctl start/status docker
docker version

确认APT添加Https协议和CA证书
apt-get install apt-transport-https ca-certificates
添加新的GPG密钥
apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
apt-get install docker.io
检查是否安装成功
docker -v
>>> ocker version 18.09.1, build 4c52b90

Usage:
docker [OPTIONS] COMMAND
A self-sufficient runtime for containers.
Options:
--config=~/.docker Location of client config files #客户端配置文件的位置
-D, --debug=false Enable debug mode #启用Debug调试模式
-H, --host=[] Daemon socket(s) to connect to #守护进程的套接字(Socket)连接
-h, --help=false Print usage #打印使用
-l, --log-level=info Set the logging level #设置日志级别
--tls=false Use TLS; implied by--tlsverify #
--tlscacert=~/.docker/ca.pem Trust certs signed only by this CA #信任证书签名CA
--tlscert=~/.docker/cert.pem Path to TLS certificate file #TLS证书文件路径
--tlskey=~/.docker/key.pem Path to TLS key file #TLS密钥文件路径
--tlsverify=false Use TLS and verify the remote #使用TLS验证远程
-v, --version=false Print version information and quit #打印版本信息并退出
Commands:
attach Attach to a running container #当前shell下attach连接指定运行镜像
build Build an image from a Dockerfile #通过Dockerfile定制镜像
commit Create a new image from a container's changes #提交当前容器为新的镜像
cp Copy files/folders from a container to a HOSTDIR or to STDOUT #从容器中拷贝指定文件或者目录到宿主机中
create Create a new container #创建一个新的容器,同run 但不启动容器
diff Inspect changes on a container's filesystem #查看docker容器变化
events Get real time events from the server#从docker服务获取容器实时事件
exec Run a command in a running container#在已存在的容器上运行命令
export Export a container's filesystem as a tar archive #导出容器的内容流作为一个tar归档文件(对应import)
history Show the history of an image #展示一个镜像形成历史
images List images #列出系统当前镜像
import Import the contents from a tarball to create a filesystem image #从tar包中的内容创建一个新的文件系统映像(对应export)
info Display system-wide information #显示系统相关信息
inspect Return low-level information on a container or image #查看容器详细信息
kill Kill a running container #kill指定docker容器
load Load an image from a tar archive or STDIN #从一个tar包中加载一个镜像(对应save)
login Register or log in to a Docker registry#注册或者登陆一个docker源服务器
logout Log out from a Docker registry #从当前Docker registry退出
logs Fetch the logs of a container #输出当前容器日志信息
pause Pause all processes within a container#暂停容器
port List port mappings or a specific mapping for the CONTAINER #查看映射端口对应的容器内部源端口
ps List containers #列出容器列表
pull Pull an image or a repository from a registry #从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to a registry #推送指定镜像或者库镜像至docker源服务器
rename Rename a container #重命名容器
restart Restart a running container #重启运行的容器
rm Remove one or more containers #移除一个或者多个容器
rmi Remove one or more images #移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者-f强制删除)
run Run a command in a new container #创建一个新的容器并运行一个命令
save Save an image(s) to a tar archive#保存一个镜像为一个tar包(对应load)
search Search the Docker Hub for images #在docker
hub中搜索镜像
start Start one or more stopped containers#启动容器
stats Display a live stream of container(s) resource usage statistics #统计容器使用资源
stop Stop a running container #停止容器
tag Tag an image into a repository #给源中镜像打标签
top Display the running processes of a container #查看容器中运行的进程信息
unpause Unpause all processes within a container #取消暂停容器
version Show the Docker version information#查看容器版本号
wait Block until a container stops, then print its exit code #截取容器停止时的退出状态值
镜像操作:from a Dockerfile
commit Create a new image from a container's changes
images List images
load Load an image from a tar archive or STDIN
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rmi Remove one or more images
search Search the Docker Hub for images
tag Tag an image into a repository
save Save one or more images to a tar archive
history 显示某镜像的历史
inspect 获取镜像的详细信息
容器及其中应用的生命周期操作:
create 创建一个容器
kill Kill one or more running containers
inspect Return low-level information on a container, image or task
pause Pause all processes within one or more containers
ps List containers
rm 删除一个或者多个容器
rename Rename a container
restart Restart a container
run 创建并启动一个容器
start 启动一个处于停止状态的容器
stats 显示容器实时的资源消耗信息
stop 停止一个处于运行状态的容器
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
wait Block until a container stops, then print its exit code
attach Attach to a running container
exec Run a command in a running container
port List port mappings or a specific mapping for the container
logs 获取容器的日志
容器文件系统操作:
cp Copy files/folders between a container and the local filesystem
diff Inspect changes on a container's filesystem
export Export a container's filesystem as a tar archive
import Import the contents from a tarball to create a filesystem image
Docker registry 操作:
login Log in to a Docker registry.
logout Log out from a Docker registry.
Volume 操作
volume Manage Docker volumes
网络操作
network Manage Docker networks
Swarm 相关操作
swarm Manage Docker Swarm
service Manage Docker services
node Manage Docker Swarm nodes
系统操作:
version Show the Docker version information
events 持续返回docker 事件
info 显示Docker 主机系统范围内的信息
启动|停止
service docker start
service docker stop
service docker status
chkconfig docker on #设置开机启动
docker run hello-world

升级|卸载
sudo apt-get upgrade
sudo apt-get purge docker.io*
sudo groupadd docker #添加docker用户组
sudo gpasswd -a $USER docker #将登录用户加入到docker用户组
newgrp docker #更新 用户组
docker ps #测试
# 镜像加速
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
测试HelloWorld
docker run hello-world

Mac
https://www.docker.com/get-started
Centos
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
镜像
镜像是一个只读的文件和文件夹组合,是Docker容器启动的先觉条件。
它包含了容器运行时所需要的所有基础文件和配置信息,是容器启动的基础。所以你想启动一个容器,那首先必须要有一个镜像。镜像是 Docker 容器启动的先决条件。
使用镜像
如果你想要使用一个镜像,你可以用这两种方式:
自己创建镜像。通常情况下,一个镜像是基于一个基础镜像构建的,你可以在基础镜像上添加一些用户自定义的内容。例如你可以基于centos镜像制作你自己的业务镜像,首先安装nginx服务,然后部署你的应用程序,最后做一些自定义配置,这样一个业务镜像就做好了。
从功能镜像仓库拉取别人制作好的镜像。一些常用的软件或者系统都会有官方已经制作好的镜像,例如nginx、ubuntu、centos、mysql等,你可以到https://hub.docker.com/ 搜索并下载它们。

搜索镜像
[root@linis_server ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9553 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3471 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 700 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 76
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 69
centurylink/mysql Image containing mysql. Optimized to be link… 61 [OK]
...
下载镜像
docker pull 拉取远程仓库的镜像到本地
命令格式一般为 docker pull [Registry]/[Repository]/[Image]:[Tag]。
Registry 为注册服务器,Docker 默认会从 docker.io 拉取镜像,如果你有自己的镜像仓库,可以把 Registry 替换为自己的注册服务器。
Repository 为镜像仓库,通常把一组相关联的镜像归为一个镜像仓库,library为 Docker 默认的镜像仓库。
Image 为镜像名称。
Tag 为镜像的标签,如果你不指定拉取镜像的标签,默认为latest。
docker pull 镜像名[:标签]
docker pull mysql
# Or
docker pull mysql:latest
# 下载指定版本
docker pull mysql:5.7
列出下载的镜像
docker images
kali# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
daocloud.io/library/mysql latest c7109f74d339 8 days ago 443MB
hello-world latest fce289e99eb9 5 months ago 1.84kB
REPOSITORY 镜像的仓库源头
TAG 镜像的标签
IMAGE ID 镜像的ID
created 镜像的创建时间
size 镜像的大小
删除镜像
- 通过id来删除
docker rmi 镜像ID
查看镜像信息
[root@linis_server ~]# docker image inspect 9a059cab6849

重命名镜像
docker tag
docker tag [SOURCE_IMAGE][:TAG] [TARGET_IMAGE][:TAG]
手动构建镜像
第一种方式是使用docker build命令基于 Dockerfile 构建镜像,也是我比较推荐的镜像构建方式;
第二种方式是使用docker commit命令基于已经运行的容器提交为镜像。
容器
容器就像一个类的实例
容器是什么呢?容器是 Docker 的另一个核心概念。通俗地讲,容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容器有初建、运行、停止、暂停和删除五种状态。
虽然容器的本质是主机上运行的一个进程,但是容器有自己独立的命名空间隔离和资源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上进程的本质区别。
启动容器
docker run --help
docker run命令直接基于镜像新建一个容器并启动,相当于
先执行docker create命令从镜像创建容器,然后再执行docker start命令启动容器
docker run <选项参数> <镜像名称> <运行的文件>
-i -t 让容器的标准输入保持打开 让Docker分配一个伪终端,并绑定到容器的标准输入上
-d 后台运行
--name='Name' 指定容器的名称 如果不指定会随机的名称进行指定,用来区分容器
-p 端口映射,将主机的端口映射到容器的一个端口 主机端口:内部容器
- 主机端口:容器端口
- 容器端口
-c 运行一段shell命令
kali# docker run -d -p 8888:8080 tomcat
771845e1556a72d06614af22e03586f70f288c2349fbd11b18608e5d9c945b16

查看容器列表
docker ps #查看运行中的容器
-a #列出所有容器包括停止的
-f #根据条件过滤显示内容
-l #列出最近创建的容器
-n #列出最近创建的N个容器,N为数字
-q #只显示容器ID
-s #显示总文件大小
kali# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38a27b6fcfd6 tomcat:8.5-jre8-slim "catalina.sh run" 2 minutes ago Up 2 minutes 8080/tcp mtomcat
启动并且进入容器
docker exec -it [ID] bash
# 退出环境
exit
# 容器不停止退出
Ctrl+P+Q
停止容器
docker stop 容器ID
kali# docker stop 38a27b6fcfd6
38a27b6fcfd6
启动容器
docker start
kali# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38a27b6fcfd6 tomcat:8.5-jre8-slim "catalina.sh run" 15 hours ago Exited (255) 2 hours ago 8080/tcp mtomcat
ed24dd3bd2b1 hello-world "/hello" 19 hours ago Exited (0) 19 hours ago boring_rosalind
kali# docker start 38a27b6fcfd6
38a27b6fcfd6
kali# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38a27b6fcfd6 tomcat:8.5-jre8-slim "catalina.sh run" 16 hours ago Up 3 seconds 8080/tcp mtomcat
删除容器
docker rm 容器ID
进入容器
容器通常都是后台方式运行的。需要进入容器。修改一些配置。
docker exec -it [ID]
docker run与start的区别
docker run 只在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器时,只需要使用命令docker start
docker run相当于执行了两步操作:将镜像放入容器中(docker create),然后将容器启动,使之变成运行时容器(docker start)
docker start的作用是,重新启动已存在的镜像
所以通过docker rename newName oldName来为容器重新命名
第二个方式
进入容器正在执行的终端。不会启动新的进程。
docker attach [id]
日志,元数据,进程的查看
容器日志
docker logs 容器ID

元数据
查看容器元数据
docker inspect [容器Id]
从容器内拷贝到主机上
docker cp id:路径 主机路径
#比如
docker cp 233:/home/main.js .
查看Docker容器进程信息
docker top [容器id]
导出容器
docker export CONTAINER 命令导出一个容器到文件,不管此时该容器是否处于运行中的状态。
docker export busybox > busybox.tar
执行以上命令后会在当前文件夹下生成 busybox.tar 文件,我们可以将该文件拷贝到其他机器上,通过导入命令实现容器的迁移。

通过docker export命令导出的文件,可以使用docker import命令导入,执行完docker import后会变为本地镜像,最后再使用docker run命令启动该镜像,这样我们就实现了容器的迁移。
docker import [OPTIONS] file|URL [REPOSITORY[:TAG]]
仓库
Docker 的镜像仓库类似于代码仓库,用来存储和分发 Docker 镜像。镜像仓库分为公共镜像仓库和私有镜像仓库。
目前,Docker Hub 是 Docker 官方的公开镜像仓库,它不仅有很多应用或者操作系统的官方镜像,还有很多组织或者个人开发的镜像供我们免费存放、下载、研究和使用。除了公开镜像仓库,你也可以构建自己的私有镜像仓库
其他
部署MySQL
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io #配置加速器
docker search mysql
docker pull mysql #下载安装
docker images # 查看是否安装成功|拥有
docker run --name imysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 -d mysql #端口映射

使用自定义MySQL配置文件
默认以/etc/mysql/my.cnf为配置文件
创建自己的配置文件目录 /my/mysql/config.cnf
docker run --name imysql2 -v /my/mysql/config.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=1234 -d mysql
部署Nginx
- 下载Nginx镜像
kali# docker pull daocloud.io/library/nginx:1.13.0-alpine
1.13.0-alpine: Pulling from library/nginx
b2388ca7fa65: Pull complete
7947be538089: Pull complete
d16f692df913: Pull complete
0dbd6ee41762: Pull complete
Digest: sha256:5c36f962c506c379bd63884976489c9c5e700c1496a6e8ea13dc404b1d258f76
Status: Downloaded newer image for daocloud.io/library/nginx:1.13.0-alpine
- 启动
docker run --name my-nginx -d -p 8080:80 nginx
docker run --name my-nginx \
-v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /some/html:/usr/share/nginx/html:ro \
-p 8080:80 \
-d nginx
-v 参数语法为 -v host dir:container dir[:ro|rw]
部署单机Redis
docker pull redis
docker run -it -d --name myredis -p 6379:6379 redis 41de2cc0b30e
参考
官网

https://github.com/jaywcjlove/docker-tutorial
问题
容器和镜像的区别?
容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个容器层,该层允许修改镜像的整个副本。

镜像包含了容器运行所需要的文件系统结构和内容,是静态的只读文件,而容器则是在镜像的只读层上创建了可写层,并且容器中的进程属于运行状态,容器是真正的应用载体。
容器的生命周期
容器的生命周期是容器可能处于的状态,容器的生命周期分为 5 种。
created:初建状态
running:运行状态
stopped:停止状态
paused: 暂停状态
deleted:删除状态

总结




