Docker安装
安装Docker
系统版本:Ubuntu20.04
官方文档:https://docs.docker.com/engine/install/ubuntu/
-
卸载旧版本(如没有则跳过)
sudo apt-get remove docker docker-engine docker.io containerd runc
-
更新apt并下载相关包
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
-
添加Docker官方GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
-
验证你拥有了key
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]
- 使用以下命令设置稳定存储库。(这里为x86_64/amd64)
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
- 安装最新版Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
也可指定版本
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
…
sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io
例如
sudo apt-get install docker-ce=<5:18.09.1~3-0~ubuntu-xenial> docker-ce-cli=<5:18.09.1~3-0~ubuntu-xenial> containerd.io
- 通过运行hello-world映像,验证Docker引擎已正确安装。
sudo docker run hello-world
hello-world - 设置开机自启
sudo systemctl enable docker
关闭开机自启
sudo systemctl disable docker
- 查看Docker运行情况
sudo systemctl status docker
Docker的中央仓库
- Docker的官方仓库
- 国内镜像仓库
- 网易蜂巢
- daocloud
镜像的操作
拉取镜像
docker pull 镜像名称[:tag]
tag表示具体版本(可写可不写)
拉取tomcat环境(daocloud)
docker pull daocloud.io/library/tomcat:8.5.15-jre8
查看本地全部的镜像
删除本地镜像
docker rmi [IMAGE ID]
镜像的导入导出
- 导出
docker save -o [src] [IMAGE ID]
- 加载
docker load -i [镜像文件]
- 修改镜像名称
docker tag [IMAGE ID] [名称:版本]
容器的操作
运行容器
- 简单语法
docker run [IMAGE ID]|[镜像名称[:tag]]
- 常用语法
docker run -dit -p 宿主机端口:容器端口 --name 容器名称 [IMAGE ID]|[镜像名称[:tag]]
-d: 后台运行容器
-p: 宿主机端口:容器端口 :映射当前Linux的端口和容器的端口
–name 容器名称: 指定容器的名称
-
运行已有容器
docker start [container_ID]
-
例如
docker run -dit -p 8080:8080 --name tomcat b8
查看运行的容器
docker ps [-q|-a]
-a: 查看全部容器,包括没有运行的容器
-q: 只查看容器的标识(IMAGE ID)
查看容器的日志
docker logs -f [IMAGE ID]
-f: 可以滚动日志的最后几行
进入容器内部
docker exec -it [container_ID] /bin/bash
停止和删除容器(删除容器前需要先停止容器)
- 停止指定的容器
docker stop [container_ID]
- 停止所用容器
docker stop $(docker ps -qa)
- 删除指定的容器
docker rm [container_ID]
- 删除所有容器
docker rm $(docker ps -qa)
启动容器
docker start [container_ID]
应用Docker(以golang环境为例)
环境搭建
拉取镜像
docker pull golang
查看镜像
运行容器
docker run -dit -name golang 4a
输入docker ps
发现容器已经运行
进入容器
docker exec -it 88 /bin/bash
输入go version
发现环境已成功运行
退出容器
exit
停止容器
docker stop 88
使用环境(运行hello.go)
在VsCode中配置环境
在VsCode中添加以下扩展
- GO
- Docker
- Docker WorkSpace
设置Docker试之可以在非root用户下运行
- 添加docker用户组
sudo groupadd docker
- 将登陆用户加入到docker用户组中
sudo gpasswd -a $USER docker
- 更新用户组
newgrp docker
- 重启系统即可
运行容器
docker start 88
将容器添加到VsCode工作区
- 打开VcCode按[F1] 输入
dockerws: Add Folder to Workspace
。接下来,选择docker容器,下一步, 选择要打开的文件夹路径即可。 - 打开VsCode资源管理器,发现go已经添加到工作区
新建hello.go文件,写入测试代码
新建hello.go文件,并写入以下代码,保存。
pakage main
import "fmt"
func main(){
fmt.Println("hello world")
}
运行hello.go
数据卷
创建数据卷
docker volume create [数据卷名称]
默认路径 /var/lib/docker/volumes/数据卷名称
数据卷中的具体内容存放在: /var/lib/docker/volumes/数据卷名称/_data
查看数据卷的详细信息
- 查看指定的数据卷
docker volume inspect [数据卷名称]
- 查看全部数据卷
docker volume ls
删除数据卷
docker volume rm [数据卷名称]
应用数据卷
- 当映射数据卷时,若数据卷不存在,Docker会帮你创建
docker run -v [数据卷名称:容器内部的路径]
- 直接指定一个路径作为数据卷的存放位置
docker run -v [路径:容器内部的路径]
DockerFile
DockerFile是什么?
DockerFile 是构建Docker镜像的构造文件,是由一系列命令的参数构成的脚本。
DockerFile基础
- dockerfile每条保留字指令都必须为大写字母,且后面要跟随至少一个参数
- 指令按照从上到下顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
DockerFile保留关键字
- FROM :基础镜像,当前新镜像是基于哪个镜像的
- MAINTAINER :镜像维护者的姓名的邮箱地址
- RUN :容器构建时需要与运行的命令
- EXPOSE :当前容器对外暴露的端口
- WORKDIR :指定在创建容器后,终端默认登陆进来的工作目录,一个落脚点
- ENV :用来搭建镜像过程中设置的环境变量
- ADD :将宿主机目录下的文件拷贝进镜像且ADD命令会自动运行URL和解压tar压缩包
- 将从构建上下文目录中<源路径>的文件/目录复制到新一层的镜像内的<目标路径>位置
COPY src dest
- VOLUME : 容器数据卷,用于保存和持久化工作
- CMD :指定一个容器启动时运行的命令,DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被的的docker run之后的参数替换
- ENTRYPOINT :指定一个容器启动时运行的命令,ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。(与CMD不同的是ENTRYPOINT的参数是追加)
- ONBUILD :当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
DockerFile案例1——自定义镜像golang
FROM golang
ENV MYPATH /go/bin/
WORKDIR $MYPATH
EXPOSE 88
CMD echo $MYPATH
CMD echo "success===========ok"
CMD /bin/bash
-
打开终端输入
docker build -f /home/violet/project/mydocker/DockerFile -t mygolang:1.15 .
(其中-f后跟你的DockerFile文件的路径),回车
示例——安装MySQL
- 搜索MySQL镜像
docker search mysql
- 拉取镜像
docker pull mysql
- 运行镜像
docker run -dit -p 1234:3306 -v /home/violet/project/mysql/conf:/etc/mysql/conf.d -v /home/violet/project/mysql/logs:/logs -v /home/violet/project/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=pass --name mysql db2b
- 进入容器
docker exec -it 112 /bin/bash
- 运行
mysql -uroot -p
本地镜像发布
docker-compsoe管理容器
下载docker-compsoe
- 去github官网搜索docker-compose
- 将docker-compose文件移到到
usr/local/
目录下
sudo mv docker-compose-Linux-x86_64 /usr/local/
- 重命名docker-compose-Linux-x86_64文件,并给予DockerCompose文件一个可执行的权限
sudo mv docker-compose-Linux-x86_64 docker-compose
chmod 777 docker-compose
- 方便后期操作,配置一个环境变量,将docker-compose文件移动到了/usr/local/bin,修改了/etc/profile文件,给/usr/local/bin配置到了PATH中
sudo mv docker-compose /usr/local/bin
vi /etc/profile
添加内容:export PATH=/usr/local/bin:$PATHsource /etc/profile
- 在任意目录下输入
docker-compose
Docker-Compose管理MySQL和Tomcat容器
- yml文件以key:value方式来指定配置信息
- 多个配置信息以换行+缩进的方式来区分
- 在docker-compose.yml文件中,不要使用制表符
version: '3.1'
services:
mysql: # 服务的名称
restart: always # 代表只要docker启动,那么这个容器就跟着一起启动
image: daocloud.io/library/mysql:5.7.4 # 指定镜像路径
container_name: mysql # 指定容器名称
ports:
- 3306:3306 # 指定端口号的映射
environment:
MYSQL_ROOT_PASSWORD: root # 指定MySQL的ROOT用户登录密码
TZ: Asia/Shanghai # 指定时区
volumes:
- /opt/docker_mysql_tomcat/mysql_data:/var/lib/mysql # 映射数据卷
tomcat:
restart: always
image: daocloud.io/library/tomcat:8.5.15-jre8
container_name: tomcat
ports:
- 8080:8080
environment:
TZ: Asia/Shanghai
volumes:
- /opt/docker_mysql_tomcat/tomcat_webapps:/usr/local/tomcat/webapps
- /opt/docker_mysql_tomcat/tomcat_logs:/usr/local/tomcat/logs
使用docker-compose命令管理容器
在使用docker-compose的命令时,默认会在当前目录下找docker-compose.yml文件
-
基于docker-compose.yml启动管理的容器
docker-compose up -d
-
关闭并删除容器
docker-compose down
-
开启|关闭|重启已经存在的由docker-compose维护的容器
docker-compose start|stop|restart
-
查看由docker-compose管理的容器
docker-compose ps
-
查看日志
docker-compose logs -f
docker-compose配合Dockerfile使用
使用docker-compose.yml文件以及Dockerfile文件在生成自定义镜像的同时启动当前镜像,并且由docker-compose去管理容器
- 编写docker-compose文件
version: '3.1'
services:
ssm:
restart: always
build: # 构建自定义镜像
context: ../ # 指定dockerfile文件的所在路径
dockerfile: Dockerfile # 指定Dockerfile文件名称
image: ssm:1.0.1
container_name: ssm
ports:
- 8081:8080
environment:
TZ: Asia/Shanghai
- 编写Dockerfile文件
from daocloud.io/library/tomcat:8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps
- 运行
可以直接基于docker-compose.yml以及Dockerfile文件构建的自定义镜像
docker-compose up -d
如果自定义镜像不存在,会帮助我们构建出自定义镜像,如果自定义镜像已经存在,会直接运行这个自定义镜像
重新构建自定义镜像
docker-compose build
运行当前内容,并重新构建
docker-compose up -d --build
错误处理
运行docker rmi [IMAGE ID]
报错
- 错误1
unable to delete b8dfe9ade316 (must be forced) - image is referenced in multiple repositories
错误原因:查看镜像发现,同一个IMAGE ID被多个REPOSITORY引用
docker rmi tomcat:8.5
再次运行docker rmi [IMAGE ID]
即可 - 错误2
unable to delete b8dfe9ade316 (must be forced) - image is being used by stopped container fef1a1b37057
错误原因:即要删除的该镜像,被容器fef1a1b37057所引用了
解决方法
- 执行
docker ps -a
查看所有容器记录(包括未运行的容器),并查看那些容器是使用了这个要删除的镜像 - 执行命令
docker rm container_ID
删除这个容器 - 再次运行
docker rmi [IMAGE ID]
即可