docker 学习笔记(一)
本文是基于Ubuntu16.04,不同操作系统可能在安装过程有些差别,但不会影响后续的容器操作。
同时本文的以下操作是基于读者已经对docker是何物,用来做什么的有大致的了解。会以陈述各种配置操作为主,若对docker尚无了解者建议结合其他资料进行阅读
本文章中总结内容全部来自书籍Docker-从入门到实践 https://legacy.gitbook.com/book/yeasy/docker_practice/details
1.安装docker
- 卸载旧版本的docker或者docker-engine
sudo apt-get remove docker docker-engine docker.id
- 使用apt安装docker-ce
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common //首先添加使用https传输的软件包及CA证书
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable" //添加apt源
sudo apt-get update
sudo apt-get install docker-ce
2.docker CE服务的启动和停止
sudo systemctl enable docker
sudo systemctl start docker
sudo systemctl stop docker
sudo systemctl restart docker
3.操作系统中哪些用户可以使用docker服务
之所以要谈这一点是因为默认情况下,docker命令会使用Unix socket与docker引擎通讯。而只有root用户和docker组用户才可以访问docker引擎的Unix socket。处于安全考虑,一般不用root用户,故需将使用docker服务的用户添加到docker组中(若无docker组需自行创建)
- 查看是否有docker组
cat /etc/group |grep docker
- 建立docker组(如果有的话就不用创建)
sudo groupadd docker
- 将使用docker服务的user1添加到docker用户组中
sudo usermod -aG docker user1
- 退出终端,重启docker服务
- 补充:若还无法使用docker服务,尝试将出错信息中用户没有权限运行的docker脚本文件添加上读写权限,之后在进行尝试
4.镜像加速器
有时从国内拉取镜像会遇到困难,需要配置镜像加速器。(对于更改过maven源的人应该不难理解)对于Ubuntu16.04+,可以在/etc/docker/daemon.json中写入下面的内容
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
之后重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker
5.使用镜像
Docker Hub上面有大量镜像可以使用,下面将谈如何获取并使用它们。
既然谈到获取镜像,那么应该一个镜像的标识,这就是镜像仓库地址和仓库名,其格式为
[Docker Registry 地址[:端口号]/]仓库名[:标签]
- Docker镜像仓库地址:地址一般格式为<域名/IP>[:端口号]。默认地址时Docker Hub
- 仓库名:仓库名是两段格式,即<用户名>/<软件名>。对于Docker Hub如果不给出用户名,则默认为library,也就是官方镜像。
例如Ubuntu16.04版本的镜像在Docker Hub中的标识为:
[Docker Hub] [library/]ubuntu:16.04
可以简写为Ubuntu:16.04
5.1获取镜像
docker pull [option] 标识
# example
docker pull ubuntu:16.04
docker pull nginx
docker pull tomcat
5.2列出镜像
docker image ls [-q] //只显示ID号,可以用于shell编程删除镜像
docker image ls ubuntu
docker image ls ubuntu:16.04
镜像ID是镜像的唯一标识。在列出的所有镜像中,一个镜像可以对应多个标签(TAG),但都具有相同的镜像ID。
5.3删除镜像
docker image rm imageID/镜像名(即仓库名:标签)
5.4利用docker commit和Dockerfile定制镜像
前面已经提到可以从仓库中下载已有的镜像,如果需要自己定制(大多是对源镜像进行修改成自己定制的新镜像)镜像怎么办?
例如,我们pull了一个nginx镜像,然后通过以下命令更改了nginx的欢迎页面,同时希望将其保存成一个我们自己定制的镜像,这样以后每次启动此镜像就可以得到我们想要的欢迎页面
$ docker run --name webserver -d -p 80:80 nginx //利用nginx镜像创建一个名称为webserver的容器
$ docker exec -it webserver bash
root@3258162e151:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
root@3258162e151:/# exit
exit
上面的命令具体各种参数代表什么暂时不用懂,只需知道我们以交互式命令的方式进入了webserver容器,执行了bash命令。我们修改了容器,也就是改动了容器的存储层,可以通过docker diff 查看具体改动。
我们已经定制好了变化,那么如何保存下来成为一个新的镜像,方便我们以后使用呢?可以用docker commit命令
docker commit webserver nginx:v2
其中webserver时容器,nginx:v2是新的定制的镜像的名称和标签
使用dockerfile定制镜像请读者自己去阅读文章开始给出的pdf书籍,这里不在详细描述(但是使用dockerfile定制镜像才是经常使用的方法,由于笔者比较懒。。。所以就。。。)
6.操作容器
有了镜像后,就可以以镜像为基础启动并运行一个容器(如果不懂镜像与容器的关系,可以下载笔者在一开始给出的电子版pdf书籍,里面有一章对两者的简短介绍)
6.1启动容器
- (通过镜像)新建容器并启动
docker run [option] 镜像名称
docker run --name nginx_container -d -p 8080:80 nginx:latest
--name:指定创建的容器的名字,如果忘记写可以通过docker ps [-a] 查看
-p:端口映射,将本地8080端口映射到docker nginx80端口
-d:docker在后台运行,而不把命令执行结果打印到当前宿主机下。
- 启动已经终止的容器
docker start 容器名称
6.2列出所有创建的容器和运行的容器
docker container ls -a //类似于docker image ls -a
docker ps //列出运行的容器
6.3终止容器
docker stop 容器名称
6.4进入容器
当需要进入容器操作时,需要用到一下命令。
docker attach 或者 docker exec(推荐后者)
进入容器前,需要先启动容器
docker start 容器名称
docker exec -it 容器名称 bash
6.5导入和导出容器
如果要导出本地某个容器,要用docker export命令
docker export 容器ID>xxx.tar
docker export 235345345>ubuntu.tar
通过导出的容器导入docker中作为镜像
cat xxx.tar | docker import -test/镜像名:标签
cat ubuntu.tar | docker import -test/myubuntu:v1.0
docker import http://example.com/exampleimage.tgz example/imagerepo
6.6删除容器
docker rm 容器ID