Docker的安装
采用在线安装,参考自docker官方文档
前提条件
操作系统要求
操作系统版本:Ubuntu Bionic 18.04
卸载旧版本
$ sudo apt-get remove docker docker-engine docker.io containerd runc
支持的存储驱动程序
Ubuntu的支持overlay2
,aufs
和btrfs
存储驱动程序。
安装方法
使用仓库安装(Install using the repository)
在新主机上首次安装Docker Engine之前,需要设置Docker存储库。之后,就可以从存储库安装和更新Docker。
设置仓库(SET UP THE REPOSITORY)
-
更新
apt
软件包索引并安装软件包以允许apt
通过HTTPS使用存储库:$ sudo apt-get update $ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common
-
添加Docker的官方GPG密钥:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
国外源较慢,可使用阿里云镜像:
$ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
通过搜索指纹的后8个字符,验证您现在是否拥有带有指纹的密钥 。$ sudo apt-key fingerprint 0EBFCD88 pub rsa4096 2017-02-22 [SCEA] 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 uid [ unknown] Docker Release (CE deb) <docker@docker.com> sub rsa4096 2017-02-22 [S]
-
使用以下命令来设置稳定的存储库。要添加 nightly或test存储库,请在下面的命令中在单词
stable
后面添加nightly
或test
(或两者)$ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
可添加阿里云镜像
$ sudo add-apt-repository \ "deb [arch=amd64] https://mirrors.aliyun.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
安装Docker仓库(INSTALL DOCKER ENGINE)
-
更新
apt
程序包索引,并安装最新版本的Docker Engine和容器,或转到下一步以安装特定版本:$ sudo apt-get update $ sudo apt-get install docker-ce docker-ce-cli containerd.io
-
要安装特定版本的Docker Engine,请在存储库中列出可用版本,然后选择并安装:
- 列出您的仓库中可用的版本:
$ apt-cache madison docker-ce docker-ce | 5:18.09.1~3-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages docker-ce | 5:18.09.0~3-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages docker-ce | 18.06.1~ce~3-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages docker-ce | 18.06.0~ce~3-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages ...
- 使用第二列中的版本字符串安装特定版本,例如
5:18.09.1~3-0~ubuntu-xenial
。
$ sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io
-
通过运行
hello-world
映像来验证是否正确安装了Docker Engine$ sudo docker run hello-world
首次执行此命令会提示本地找不到该镜像,接着自动执行pull命令拉取镜像,并显示签名信息和运行结果。依据返回结果我们可以判断Docker是否安装成功。
-
查看本地Docker镜像
$ sudo docker images
这时候
hello-world
已经在本地镜像了。
卸载Docker(Uninstall Docker Engine)
-
卸载Docker Engine,CLI和Containerd软件包
$ sudo apt-get purge docker-ce docker-ce-cli containerd.io
-
主机上的镜像,容器,卷或自定义配置文件不会自动删除。要删除所有镜像,容器和卷:
$ sudo rm -rf /var/lib/docker
我们可以发现
/var/lib/docker
是Docker镜像默认存储路径
阿里云镜像加速
-
登陆阿里云找到容器镜像服务下的镜像加速器
-
输入操作文档内的命令
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://qatn66l7.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
基本命令
可参照官方给出的reference
帮助命令
命令后面添加--help
$ docker search --help #搜索镜像
Usage: docker search [OPTIONS] TERM
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
镜像命令
-
查看本地镜像
$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest bf756fb1ae65 5 months ago 13.3kB #可选项 -q 只显示id -a 显示所有镜像 # 解释 repository 镜像的仓库源 tag 镜像的标签 image id 镜像的id created 镜像创建的日期 size 镜像的大小
-
搜索镜像
比如搜索mysql
sudo docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 9677 [OK] mariadb MariaDB is a community-developed fork of MyS… 3520 [OK] mysql/mysql-server Optimized MySQL Server Docker images. Create… 705 [OK] #可选项 --filter = 条件 过滤搜索结果
-
下载镜像
$ docker pull ubuntu:14.04 # :后面指定版本号,不指定就默认最新版 14.04: Pulling from library/ubuntu 5a132a7e7af1: Pull complete #分层下载 fd2731e4c50c: Pull complete 28a2f68d1120: Pull complete a3ed95caeb02: Pull complete Digest: sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2 Status: Downloaded newer image for ubuntu:14.04
-
删除镜像
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE test1 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) test2 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) $ docker rmi test1:latest #通过digest:tag删除 Untagged: test1:latest $ docker rmi -f fd484f19954f #通过-f id删除 Untagged: test1:latest Untagged: test:latest Untagged: test2:latest Deleted: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8 $ docker rmi -f $(docker images -aq) #递归删除所有镜像
容器命令
先获取Ubuntu镜像,用来创建容器
$ sudo docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
a4a2a29f9ba4: Pull complete
127c9761dcba: Pull complete
d13bf203e905: Pull complete
4039240d2e0b: Pull complete
Digest: sha256:35c4a2c15539c6c1e4e5fa4e554dac323ad0107d8eb5c582d6ff386b383b7dce
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
新建容器并启动
$ sudo docker run [可选参数] image
# 参数说明
--name name 容器名字,用来区分容器
-d 后台运行
-it 采用交互方式运行,进入容器查看内容
-p(小写) 指定容器端口(主机端口:容器端口)
-P(大写) 随机指定端口
# 启动并进入容器
master@ubuntu:/$ sudo docker run -it ubuntu /bin/bash
root@badfc42d23dd:/#
# 退出容器
root@badfc42d23dd:/etc# exit
exit
master@ubuntu:/$
# 退出不停止容器
ctrl+p+q
查看容器并启动
# 查看所有停止的和正在运行的容器
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
badfc42d23dd ubuntu "/bin/bash" 7 minutes ago Exited (0) 3 minutes ago nervous_maxwell
4d829636f1a0 hello-world "/hello" 18 hours ago Exited (0) 18 hours ago elated_haibt
# 启动一个已停止的容器
$ sudo docker start badfc42d23dd
# 进入一个后台运行的容器
$ sudo docker attach 8a1452e443ff #exit会终止
$ sudo docker exec -it 8a1452e443ff /bin/bash #exit会继续在后台运行
停止容器
$ sudo docker stop badfc42d23dd
# 停止的容器可通过docker restart重启
$ sudo docker restart badfc42d23dd
删除容器
$ sudo docker rm -f 6f8509b99c35
# 删除所有终止状态的容器
$ sudo docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
badfc42d23ddc178f9baf4d861344987a55b99ae28d00e512d3d4d785bd47c4b
4d829636f1a0990a5b8566a75e1cfa9221b3434d94d2606e6879d66608456388
Total reclaimed space: 32B
查看容器元数据
$ sudo docker inspect 626ec0eeb370
运行一个web应用
接下来让我们尝试使用 docker 构建一个 web 应用程序。
我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。
$ sudo docker pull training/webapp #拉取镜像
$ sudo docker run -d -P training/webapp python app.py #随机端口映射
访问web应用
docker ps
命令查看容器,获得端口号
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f3b9b5afaf3 training/webapp "python app.py" 12 seconds ago Up 10 seconds 0.0.0.0:32768->5000/tcp nervous_tharp
利用id或名字查看端口
$ sudo docker port 9f3b9b5afaf3
$ sudo docker port nervous_tharp
查看web程序日志
docker logs [ID或者名字] 可以查看容器内部的标准输出。
$ sudo docker logs -f 9f3b9b5afaf3
查看web程序进程
我们还可以使用 docker top 来查看容器内部运行的进程
$ sudo docker top 9f3b9b5afaf3
commit镜像
docker commit # 提交容器成为新的副本,可以用来保存当前容器状态
# 类似git指令
docker commit -m="提交描述的信息" -a="作者" 容器id 新的镜像名:[TAG]
# 修改镜像版本号tag
docker tag 7853e6064af8 centos-test:7.4.1708
容器数据卷
概念:由于镜像只打包应用和环境,容器数据不可持久化,利用数据卷技术实现目录挂载,将docker容器中的数据同步到本地,容器间也可实现数据共享。
好处:对于容器的修改不需要进入容器,可直接在本地进行
使用方法
使用-v
命令
docker run -it -v 主机目录:容器目录 # 可挂载多个目录
# 容器被停止了,主机修改的数据也会被同步到容器
# -e 环境配置 如:设置mysql的密码
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=c07cfc4ef3a8c096 --name mysql01 mysql
匿名挂载和具名挂载
# 匿名挂载
docker run -d -P --name mysql02 -v /etc/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
# 具名挂载
docker run -d -P --name mysql03 -v mysql03:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
# 通过 docker volume ls 查看
DRIVER VOLUME NAME
local 3bac2caa6e9bc733a9d3a602ef91ff63ced693a79036972877380544f7ee3abe
local ca1cd9acd2e96f576956b6980b318cdad7dada13947818bf98955207c1acaa79
local d1f9e2ccec189ae89f72a066b9a99bd5e37444672b654ae59c5fbe33b2d12473
local f2a4ccbdf3ceb05e6ddc4a1f293ea0e65af0d8eedfdf6e9d2a8fac49457df117
local mysql03
# 区分
-v /容器内路径 # 匿名挂载
-v 数据卷名:/容器内路径 # 具名挂载
-v /主机路径:/容器内路径 # 指定路径挂载
#扩展
容器内路径:ro/rw
ro #readonly 只读,只能通过主机操作
rw #readwrite 可读可写,默认
DockerFile
指令
FROM # 基础镜像,如centos
MAINTAINER # 镜像作者:姓名+邮箱
RUN # 构建镜像的时候需要的命令
ADD # 添加镜像,如tomcat
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 端口配置
CMD # 指定容器启动时运行的命令
ENTRYPOINT # 指定容器启动时运行的命令,可追加
ENV # 构建的时候设置环境变量
Docker网络
自定义网络
# 查询网络
docker network ls
NETWORK ID NAME DRIVER SCOPE
570ecf3acbaa bridge bridge local
c1b486d234a3 host host local
5a457db59398 none null local
# 网络模式
bridge:桥接网络(默认)
none:不配置网络
host:与宿主机共享网络
# --link只能单向ping通
#自定义桥接网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet