Docker 简易教程
唠唠闲话
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
Docker 安装(Ubuntu 系统)
-
下载并执行脚本
1
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
或者使用 daocloud 脚本
1
curl -sSL https://get.daocloud.io/docker | sh
安装需等待较长时间
-
安装完成后,显示页面如下
基本使用
- 帮助启动类命令
- 启动 Docker
systemctl start docker
- 停止 Docker
systemctl stop docker
- 重启 Docker
systemctl restart docker
- 查看状态
systemctl status docker
- 开机启动
systemctl enalbe docker
- 查看概要
docker info
- 启动 Docker
Docker 的三个重要概念,容器,镜像和定制镜像文件。
镜像基础
镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所拥有内容。
-
查看本地镜像
docker images
-
搜索镜像
docker search
--limit int
设定搜索数目
-
拉取镜像
docker pull
1
2
3
4# 下载 nginx 镜像
docker pull nginx
# 下载 ubuntu 镜像
docker pull ubuntu默认下载最新版本,如果需要指定版本,可以使用
docker pull <镜像名>:<tag>
-
删除镜像
docker rmi <镜像名>
;若存在镜像对应的容器,则需通过-f
参数强制删除
容器
容器是真正干活的对象。
-
创建容器
docker run
是启动交互式容器命令--name <名称>
指定名称,默认使用随机名称-d
后台运行容器-i
interact 交互模式启动,通常与-t
参数一并使用-t
terminal 为容器分配伪输入终端-P
随机端口映射-p
指定端口映射,比如-p 2333:23
将外部 2333 端口映射到容器 23 端口-v
挂载文件系统,比如-v <主机路径>:<容器路径>
-
容器创建示例
1
docker run --name rexwzh -it ubuntu /bin/bash
以交互模式启动一个容器,并在容器内执行
/bin/bash
操作。注意如果使用 exit 退出,则容器关闭,而使用ctrl+p+q
退出,则容器保持运行
注:也可以使用create
命令,创建但不启动 -
查看当前容器
docker ps
-a
将已经关闭的容器一并显示
-l
显示最近创建的容器
-n
显示最近创建的 n 个容器 -
启用和停止容器
docker stop/start <容器ID/名字>
1
2
3
4
5
6# 关闭 nginx 容器
docker stop 990 # 输入 ID 前几位即可
# 重新启动 nginx 容器
docker start 990
# 停止所有容器
docker stop $(docker ps -a -q) -
删除容器
docker rm <容器id>
- 如果容器正在启用,删除需使用
-f
参数 docker rm -f $(docker ps -a -q)
删除所有容器
- 如果容器正在启用,删除需使用
-
进入已启动的容器
docker exec -it <容器ID> /bin/bash
docker attach -it <容器ID>
这种方式用 exit 退出后会导致容器停止,因而较少用到
-
查看容器变化
docker diff <容器>
,这里应该是相对于镜像的变化 -
容器管理
- 容器文件备份
docker ps <容器ID>:<文件路径> <目标路径>
- 容器快照导出
docker export 容器ID > 备份文件.tar
- 容器快照导入
cat 备份文件.tar | docker import - <镜像名/镜像名:版本>
- 容器文件备份
镜像进阶
docker 镜像技术的基础是联合文件系统(UnionFS),其文件系统是分层的。这样既可以充分利用共享层,又可以减少存储空间占用。Docker 镜像层都是只读的,当容器启动时,一个新的可写层会加载到镜像的顶部,作为容器层。
将容器保存为镜像 docker commit <容器> <镜像名>:<版本号>
-m <提交信息>
提交信息,参数可选- 版本号可省略,默认为 latest
- 用
commit
命令保存的镜像,由于增加了可写层,因此体积会比原镜像大,不推荐使用 - 保存镜像
docker save <镜像名> > <文件名>
- 导入镜像
docker load <文件名>
- 将容器保存为镜像,
docker commit <容器名>
远程访问
-
在 Docker Hub 注册账号
-
选择创建仓库,比如
rexwzh/helloworld
Docker 免费用户只能创建一个私有仓库(公开仓库规则暂时不清楚)Docker Registry 用于搭建本地的镜像仓库。
-
构建镜像,编写 Dockerfile 后,执行
1
docker build -t <镜像名>:<版本号> .
-
发布到 Docker Hub
docker login
登录docker push <镜像名>
发布docker pull <镜像名>
拉取
ssh 连接
参考链接: CSDN
容器设置
-
创建容器,比如
1
docker run -it --name mydocker -p 2333:2333 -v /home/rex/mydocker:/root/workspace ubuntu:latest
参数说明:
--name
容器名称-p 2333:2333
容器端口映射,左边为外部访问端口,右边为宿主机的端口,可指定多个-v 外部路径:容器路径
将外部路径挂载到容器中
-
进入容器
1
docker exec -it mydocker /bin/bash
-
更新软件,安装
ssh
工具,并设置密码1
2
3apt-get update
apt-get install openssh-server
passwd -
修改
ssh
配置文件1
vim /etc/ssh/sshd_config
修改内容:
- 将
PremitRootLogin
参数改为PremitRootLogin yes
- 将
Port 22
改为容器端口,比如这里是Port 2333
- 将
-
重启
ssh
服务1
service ssh restart
-
输入
ssh root@[IP 地址] -p 2333
进行测试,这里2333
为容器设置的端口号
SSH 免密设置
-
新建本地 ssh 密钥,比如
1
ssh-keygen -t rsa -C "youxiang@qq.com" -f ~/.ssh/xxx_rsa
-
将本地密钥添加到容器中,比如
1
ssh-copy-id -p 2333 -i ~/.ssh/xxx_rsa root@[IP 地址]
如果设置了过多密钥,提示验证错误,则增加
-o
参数1
ssh-copy-id -p 2333 -i ~/.ssh/xxx_rsa root@[IP 地址] -o PubkeyAuthentication=no
-
配置本地密钥文件
1
2
3
4
5
6
7vim ~/.ssh/config
## 增加一条规则
Host [IP 地址简写]
HostName [IP 地址]
User root
Port 2333
IdentityFile ~/.ssh/xxx_rsa之后输入
ssh <Host 内容>
就能访问容器了
注:如果 ssh 访问容器提示
refused
,可能端口没修改,或者容器被关闭,尝试重新进入容器并执行server ssh restart
其他
添加用户组,允许用户组使用 docker 命令
1 | ## 添加组 |