Docker基本用法
[官网]https://www.docker.com/
[官方文档]https://docs.docker.com/
Docker 安装
基本组成
镜像(image):
相当于一个模板,通过镜像可以创建多个容器容器(container):
Docker利用容器技术,独立运行一个或一组应用, 类似一个简单的Linux系统仓库(repository)
存放镜像的地方
卸载旧版本的Docker
1
sudo apt-get remove docker docker-engine docker.io containerd runc
安装Docker Engine社区版
使用存储库安装,在新主机上首次安装Docker Engine社区版之前,需要设置Docker存储库。运行以下命令添加Docker的官方GPG密钥:
1
bash`sudo apt-get update && sudo apt-get install ca-certificates curl gnupg`
使用以下命令设置存储库:
1
2bash`echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg
运行以下命令以安装Docker Engine社区版:
1
bash`sudo apt-get update && sudo apt-get install docker-engine`
设置镜像仓库:
编辑文件
/etc/docker/daemon.json
1
2
3
4
5{
"registry-mirrors": ["https://<your_acceleration_address>"]
}
#科大镜像源: https://docker.mirrors.ustc.edu.cn保存后重新启动Docker守护程序以应用新的配置:
1
2sudo systemctl daemon-reload
sudo systemctl restart docker卸载Docker
卸载 Docker Engine、CLI、containerd 和 Docker Compose 软件包:
1
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
主机上的映像、容器、卷或自定义配置文件 不会自动移除。要删除所有映像、容器和卷
1
2sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
常用命令
帮助命令
1 | docker version #显示docker的版本信息 |
镜像命令
docker images
- REPOSITORY (镜像的仓库源)
- TAG
- IMAGE ID
- CREATED (创建时间)
- SIZE
-a, --all
列出所有镜像-q, --quiet
只显示镜像的id
docker search
1
2
3
4
5
6
7yuki@VM-4-3-ubuntu:~$ docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 14447 [OK]
mariadb MariaDB Server is a high performing open sou… 5513 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 860 [OK]
percona Percona Server is a fork of the MySQL relati… 619 [OK]
bitnami/mysql Bitnami MySQL Docker Image 96
docker pull
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21# docker pull 镜像名[:tag]
yuki@VM-4-3-ubuntu:~$ docker pull mysql
Using default tag: latest # 如果不写 tag,默认就是latest
latest: Pulling from library/mysql
b193354265ba: Pull complete #分层下载,联合文件系统
14a15c0bb358: Pull complete
02da291ad1e4: Pull complete
9a89a1d664ee: Pull complete
a24ae6513051: Pull complete
b85424247193: Pull complete
9a240a3b3d51: Pull complete
8bf57120f71f: Pull complete
c64090e82a0b: Pull complete
af7c7515d542: Pull complete
Digest: sha256:c0455ac041844b5e65cd08571387fa5b50ab2a6179557fd938298cab13acf0dd
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址
# docker pull mysql
# 等价于 docker pull docker.io/library/mysql:latest
# 指定版本下载 docker pull mysql:5.7
docker rmi
+ 镜像id
删除镜像docker commit CONTAINER IMAGE_NAME:TAG
:创建某个container的镜像
以容器创建一个新的镜像时,该容器的原始镜像文件必须存在1
docker commit -m="Message" -a="Author" CONTAINER 目标镜像名:[TAG]
docker save -o ubuntu_20_04.tar ubuntu:20.04
: 将镜像ubuntu:20.04
导出到本地文件ubuntu_20_04.tar
中docker load -i ubuntu_20_04.tar
:将镜像ubuntu:20.04
从本地文件ubuntu_20_04.tar
中加载出来
容器命令
docker rum + [arg] images
新建容器并启动--name="Name"
容器名字-d
后台方式运行 容器启动后 如果没有为前台进程提供服务则会自动停止-it
使用交互方式运行-p
-p
ip
:主机端口:容器端口-p
主机端口:容器端口-p
容器端口
- -P 随机指定端口
docker ps
列出所有当前正在运行的容器-a
查看本地的所有容器-q
只显示容器编号
exit
退出容器并停止运行Ctrl + P + Q
退出容器并挂起docker rm + CONTAINER
删除容器docker start CONTAINER
docker restart CONTAINER
docker stop CONTAINER
docker kill CONTAINER
强制停止当前容器docker top CONTAINER
查看容器中进程信息docker inspect CONTAINER
查看镜像的元数据docker exec -it CONTAINER bashShell
进入当前正在运行的容器
- 进入容器后开启一个新的终端
1
2
3yuki@VM-4-3-ubuntu:~$ docker exec -it cent /bin/bash
[root@7f67c0db015f /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
docker attach CONTAINER
进入容器正在执行的终端
注意:
当使用docker exec退出容器时,容器会继续运行. 而当使用docker attach退出容器时,容器将会停止运行
docker cp CONTAINER: path destination
从容器内拷贝文件到主机上
docker update CONTAINER --memory 500MB
:修改容器限制docker rename CONTAINER1 CONTAINER2
:重命名容器docker stats
:查看所有容器的统计信息,包括CPU、内存、存储、网络等信息docker export -o xxx.tar CONTAINER
:将容器CONTAINER导出到本地文件xxx.tar中
不需要容器的镜像文件存在docker import xxx.tar image_name:tag
:将本地文件xxx.tar导入成镜像,并将镜像命名为image_name:tag
docker export/import与docker save/load的区别:
export/import会丢弃历史记录和元数据信息,仅保存容器当时的快照状态
save/load会保存完整记录,体积更大
部署nginx
1 | docker pull nginx |
容器数据卷
docker run -it -v Source : Destination
1 | # $docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag |
-v 容器内路径
匿名挂在-v 卷名:容器内路径
具名挂载/宿主机路径 : 容器内路径
指定路径挂在
查看所有volume: docker volume ls
1 | yuki@VM-4-3-ubuntu:~$ docker run -d -P --name nginx02 -v nginx-dir:/etc/nginx nginx |
--volumes-from CONTAINERl
两个容器同步
1 | docker run -it --name test01 --volumes-from test centos |
DockerFile
常用命令FROM
指定基础镜像AMINTAINER
维护者信息RUN
构建时需要运行的命令ADD
添加文件WORKDIR
设置当前工作目录VOLUME
挂载的目录EXPOSE
指定对外的端口CMD
启动容器时需要运行的命令,当有多个命令时只有最后一个命令会生效ENTRYPOINT
可以追加命令ONBUILD
触法指令 当构建一个被继承的 DockerFile时会运行COPY
将文件 copy到镜像中ENV
设置环境变量
1 | FROM centos:7 |
docker build -f Dockerfile -t 镜像名:[tag] .
发布自己的镜像
DockerHub
docker login -u
+username
登录账号docker push
1
2
3docker tag f040bc083d13 murasame01/nginx:1.0
#发布前给自己的镜像加一个tag
docker push murasame01/nginx:1.0
修改容器与宿主机的端口映射
通过修改配置文件修改
docker inspect CONTAINER | grep Id
查看完整的容器idcd /var/lib/docker/containers
进入容器目录docker stop CONTAINER
停止容器systemctl stop docker
停止主机对docker的服务- 修改
hostconfig.json
和config.v2.json
vi hostconfig.json
1
2
3
4
5
6如果之前没有端口映射, 在PortBindings下边添加以下内容,端口配置之间用英文字符逗号隔开:
"PortBindings":{}
增加一个映射, 这样写:
"PortBindings":{"8080/tcp":[{"HostIp":"","HostPort":"60000"}]}
前一个数字是容器端口, 后一个是宿主机端口。将宿主机的60000端口映射到容器的8080端口
而修改现有端口映射更简单, 把端口号改掉就行。config.v2.json
找到ExposedPorts, 仿照之前内容添加端口映射1
2举例:
"ExposedPorts":{"80/tcp":{},"3306/tcp":{},"XXXX/tcp":{}} #注:这里写的都是容器内的端口
- 重启 docker服务 注意!
1
2systemctl restart docker
docker start CONTAINERsystemctl stop docker:这个命令会停止整个Docker守护进程1。这意味着所有由该守护进程管理的容器都会被停止,包括那些设置了自动重启策略的容器1。因此,当你需要修改hostconfig.json文件时,使用这个命令可以确保容器在修改过程中不会被自动重启1。
docker stop 容器:这个命令只会停止一个特定的Docker容器2。如果该容器设置了自动重启策略,那么在你尝试修改hostconfig.json文件的过程中,容器可能会被自动重启2。这可能会导致你的修改无法生效,或者在修改过程中产生错误2。
因此,当你需要修改Docker容器的hostconfig.json文件时,应该使用systemctl stop docker命令来确保所有容器都被正确地停止,从而避免在修改过程中出现问题。
把运行中的容器生成新的镜像,再新建容器
- 提交一个运行中的容器为镜像
1
docker commit [containerid] [new_imagename]
- 运行新建的镜像并添加端口映射
1
docker run -d -p 8000:80 [imagename] /bin/bash
- 提交一个运行中的容器为镜像