一、容器简介
Docker 帮助系统管理员和程序员在容器中开发应用程序,并且可以扩展到成千上万的节点,容器和 VM(虚拟机)的主要区别是,容器提供了基于进程的隔离,而虚拟机提供了资源的完全隔离。虚拟机可能需要一分钟来启动,而容器只需要一秒钟或更短,容器使用宿主操作系统的内核,而虚拟机使用独立的内核,Docker 的局限性之一是,它只能用在 64 位的操作系统上。
- docker的理念:
- 将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
- 容器之间希望有可能共享数据
1.1 容器的定义
Docker的基本组成:镜像(image)、容器(container)、仓库(repository)
Docker利用容器(container)独立运行的一个或一组应用。容器是用镜像创建的运行实例,每个容器都行相互隔离的、保证安全的平台。
容器是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
1.2 镜像的定义
UnionFS(联合文件系统):Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
镜像加载原理:docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
二、简单安装容器
环境:
系统版本:CentOS Linux release 7.6.1810 (Core)
内核版本:3.10.0-957.el7.x86_64
##Docker 软件包已经包括在默认的 CentOS-Extras 软件源里。因此想要安装 docker,只需要运行下面的 yum 命令:
[root@186 ~]# yum install docker* -y
...........................................................
##如果报错就安装三个依赖包,yum-utils提供yum-config-manager包,用来管理yum配置文件;lv2和device-mapper-persistent-data为dockerdevicemapper存储设备的必须依赖
[root@186 ~]# yum install -y yum-utils device-mapper* lvm2
................................................................................................
##安装成功就启动服务,查看服务状态检查是否启动成功
[root@186 ~]# systemctl start docker
[root@186 ~]# systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@186 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since 四 2019-08-15 15:00:22 CST; 16s ago
Docs: http://docs.docker.com
Main PID: 8229 (dockerd-current)
CGroup: /system.slice/docker.service
├─8229 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtim...
└─8234 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics...
8月 15 15:00:20 186 dockerd-current[8229]: time="2019-08-15T15:00:20.993812526+08:00" level=info msg="libcontainerd: n... 8234"
8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.077694666+08:00" level=info msg="Graph migration ...conds"
8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.078553209+08:00" level=info msg="Loading containe...tart."
8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.099355199+08:00" level=info msg="Firewalld running: true"
8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.261051865+08:00" level=info msg="Default bridge (...dress"
8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.425824071+08:00" level=info msg="Loading containe...done."
8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.492111727+08:00" level=info msg="Daemon has compl...ation"
8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.492745036+08:00" level=info msg="Docker daemon" c...1.13.1
8月 15 15:00:22 186 systemd[1]: Started Docker Application Container Engine.
8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.500602634+08:00" level=info msg="API listen on /v....sock"
Hint: Some lines were ellipsized, use -l to show in full.
##查看docker版本。docker版本为1.13.1,API版本为1.26
[root@186 ~]# docker version
Client:
Version: 1.13.1
API version: 1.26
Package version: docker-1.13.1-102.git7f2769b.el7.centos.x86_64
Go version: go1.10.3
Git commit: 7f2769b/1.13.1
Built: Mon Aug 5 15:09:42 2019
OS/Arch: linux/amd64
Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Package version: docker-1.13.1-102.git7f2769b.el7.centos.x86_64
Go version: go1.10.3
Git commit: 7f2769b/1.13.1
Built: Mon Aug 5 15:09:42 2019
OS/Arch: linux/amd64
Experimental: false
##下载官方我CentOS镜像到本地并确认
[root@186 ~]# docker pull centos
Using default tag: latest
Trying to pull repository docker.io/library/centos ...
latest: Pulling from docker.io/library/centos
8ba884070f61: Pull complete
Digest: sha256:a799dd8a2ded4a83484bbae769d97655392b3f86533ceb7dd96bbac929809f3c
Status: Downloaded newer image for docker.io/centos:latest
[root@186 ~]# docker images centos
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest 9f38484d220f 5 months ago 202 MB
##切入到容器中,我们可以看到 CentOS 容器已经被启动,并且我们看到了 bash 提示符。在 docker 命令中我们使用了 “-i 捕获标准输入输出”和 “-t 分配一个终端或控制台”选项。断开输入exit
[root@186 ~]# docker run -i -t centos /bin/bash
[root@31a625f874c1 /]# ip a
bash: ip: command not found
[root@31a625f874c1 /]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
##显示当前正在运行容器的列表
[root@186 ~]# docker ps -a
[root@186 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
139e4dee63e1 centos "/bin/bash" 19 seconds ago Exited (0) 18 seconds ago sad_tesla
31a625f874c1 centos "/bin/bash" 26 minutes ago Exited (127) 25 minutes ago zealous_saha
三、容器常用命令
- 管理命令:
container 管理容器
image 管理镜像
network 管理网络
node 管理Swarm节点
plugin 管理插件
secret 管理Docker secrets
service 管理服务
stack 管理Docker stacks
swarm 管理Swarm集群
system 查看系统信息
volume 管理卷
如:docker container ls 显示所有容器
- 普通命令:
attach 进入一个运行的容器
build 从一个DockerFile构建镜像
commit 从容器创建一个镜像
cp 从容器和主机文件系统之间拷贝文件
create 创建一个容器
diff 检查容器文件系统上的更改
events 从服务器获取实时事件
exec 在正在运行的容器中运行命令
export 将容器的文件系统导出为tar存档
history 显示镜像的历史记录
images 查看镜像列表
import 从归档文件中创建镜像
info 显示系统范围的信息
inspect 返回Docker对象的低级信息
kill kill运行中的容器
load 从存档或者STDIN加载镜像
login 登陆docker镜像仓库
logout 退出docker镜像仓库
logs 获取一个容器的日志
pause 暂停一个或多个容器中的所有进程
port 查看端口映射或容器的特定映射列表
ps 查看容器列表
pull 从镜像仓库拉取镜像
push 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
rename 重命名容器
restart 重启容器
rm 删除容器
rmi 删除镜像
run 创建一个新的容器并运行一个命令
save 将指定镜像保存成 tar 归档文件
search 从Docker Hub搜索镜像
start 启动容器
stats 实时显示容器资源使用情况的统计信息
stop 停止容器
tag 标记本地镜像,将其归入某一仓库
top 展示一个容器中运行的进程
unpause 恢复容器中所有的进程
update 更新容器配置
version 显示Docker的版本信息
wait 阻塞直到容器停止,然后打印退出代码
如:docker images 显示所有镜像
3.1 run创建容器
docker run 命令格式
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-d, --detach=false 指定容器运行于前台还是后台,默认为false
-i, --interactive=false 打开STDIN,用于控制台交互
-t, --tty=false 分配tty设备,该可以支持终端登录,默认为false
-u, --user="" 指定容器的用户
-a, --attach=[] 标准输入输出流和错误信息(必须是以非docker run -d启动的容器)
-w, --workdir="" 指定容器的工作目录
-c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用
-e, --env=[] 指定环境变量,容器中可以使用该环境变量
-m, --memory="" 指定容器的内存上限
-P, --publish-all=false 指定容器暴露的端口
-p, --publish=[] 指定容器暴露的端口
-h, --hostname="" 指定容器的主机名
-v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录
--volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录
--cap-add=[] 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cap-drop=[] 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cidfile="" 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
--cpuset="" 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
--device=[] 添加主机设备给容器,相当于设备直通
--dns=[] 指定容器的dns服务器
--dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
--entrypoint="" 覆盖image的入口点
--env-file=[] 指定环境变量文件,文件格式为每行一个环境变量
--expose=[] 指定容器暴露的端口,即修改镜像的暴露端口
--link=[] 指定容器间的关联,使用其他容器的IP、env等信息
--lxc-conf=[] 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
--name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
--net="bridge" 容器网络设置:
bridge 使用docker daemon指定的网桥
host //容器使用主机的网络
container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
none 容器使用自己的网络(类似--net=bridge),但是不进行配置
--privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities
--restart="no" 指定容器停止后的重启策略:
no:容器退出时不重启
on-failure:容器故障退出(返回值非零)时重启
always:容器退出时总是重启
--rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
--sig-proxy=true 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
- 示例:
[root@186 ~]# docker run -p 8090:8080 -p 50000:50000 --restart always --link Redis:redis --name jenkins -v /home/jenkins:/home/jenkins_home --privileged=true dokcer.io/jenkins/jenkins
-p:把容器的8080端口映射到宿主机8090上
-v:主机的目录/home/jenkins映射到容器的目录/home/jenkins_home
--name:给容器起个名字jenkins,docker.io/jenkins/jenkins是你下载的镜像
--restart:always 容器退出时总是重启
--privileged=true:挂载主机目录Docker访问出现Permission denied的解决办法
--link:为redis容器起个别名Redis,访问的时候使用别名Redis
四、主要命令使用实例
## 拉取/上传 pull--- 从国外的官方镜像仓库拉取镜像,不指定版本就默认是最新版本,因为网速问题更推荐从国内阿里云等镜像获取。docker push推送本地镜像到服务器
[root@186 ~]# docker pull redis
Using default tag: latest
Trying to pull repository docker.io/library/redis ...
latest: Pulling from docker.io/library/redis
1ab2bdfe9778: Pull complete
966bc436cc8b: Pull complete
c1b01f4f76d9: Pull complete
8a9a85c968a2: Pull complete
8e4f9890211f: Pull complete
93e8c2071125: Pull complete
Digest: sha256:9755880356c4ced4ff7745bafe620f0b63dd17747caedba72504ef7bac882089
Status: Downloaded newer image for docker.io/redis:latest
##镜像images---(images列出所有镜像,images -a列出所有镜像包括历史,images --tree显示镜像的所有层,rmi <IMAGE ID>删除一个镜像)
[root@186 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/redis latest f7302e4ab3a8 17 hours ago 98.2 MB
docker.io/nginx latest 4733136e5c3c 24 hours ago 126 MB
docker.io/mysql latest 62a9f311b99c 25 hours ago 445 MB
docker.io/centos latest 9f38484d220f 5 months ago 202 MB
## 日志logs ---(查看某容器的日志)
[root@186 ~]# docker logs -f -t --tail 10 cc1084e70cab
2019-08-15T07:41:23.641939000Z [root@cc1084e70cab /]# df -h
2019-08-15T07:41:23.642167000Z Filesystem Size Used Avail Use% Mounted on
2019-08-15T07:41:23.642363000Z overlay 10G 1.5G 8.6G 15% /
2019-08-15T07:41:23.642591000Z tmpfs 487M 0 487M 0% /dev
2019-08-15T07:41:23.642778000Z tmpfs 487M 0 487M 0% /sys/fs/cgroup
2019-08-15T07:41:23.642973000Z /dev/mapper/centos-root 10G 1.5G 8.6G 15% /etc/hosts
2019-08-15T07:41:23.643159000Z shm 64M 0 64M 0% /dev/shm
2019-08-15T07:41:23.643346000Z tmpfs 487M 0 487M 0% /proc/acpi
2019-08-15T07:41:23.643623000Z tmpfs 487M 0 487M 0% /proc/scsi
2019-08-15T07:41:23.643863000Z tmpfs 487M 0 487M 0% /sys/firmware
## 网络network---(create创建,inspect查看,disconnet网络中移除或断开某容器,rm删除)
[root@186 ~]# docker network create mynet
e78d79314337a7cb9a3acfb340f624272fcfb53126866c463c87d8d2d2cdb980
[root@186 ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "e78d79314337a7cb9a3acfb340f624272fcfb53126866c463c87d8d2d2cdb980",
"Created": "2019-08-15T15:53:53.833288083+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]