无任何基础的docker入门

下载安装

根据官网上的指引,可以在Ubuntu上下载docker。其中有

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

这一段,是把docker的仓库加入apt源中。但是貌似不加也可以直接下载,甚至速度更快。

然后sudo apt-get updatesudo apt-get install docker-ce docker-ce-cli containerd.io 即可进行安装。

基本使用

根据官方教程,通过命令 docker run hello-world 可以验证docker是否安装成功。这时候注意到会有报错信息Permission denied,这时候说明当前用户没有权限访问Docker,需要在命令前加上sudo

如果不想每次都加上sudo,则可以通过以下方法解决。

sudo newgrp docker
sudo gpasswd -a 你的用户名 docker
sudo service docker restart

表示把当前的用户列入docker用户组。

然后我们执行docker run hello-world,可以得到正常的结果,即第一行显示:

Hello from Docker!

这样表示我们的Docker已经安装成功。

继续查看官网教程的第二部分,让我们下载一个示例项目。这个项目下载下来后,可以看到一个如下的Dockerfile文件:

# Use the official image as a parent image
FROM node:current-slim
# Set the working directory
WORKDIR /usr/src/app
# Copy the file from your host to your current location
COPY package.json .
# Run the command inside your image filesystem
RUN npm install
# Inform Docker that the container is listening on the specified port at runtime.
EXPOSE 8080
# Run the specified command within the container.
CMD [ "npm", "start" ]
# Copy the rest of your app's source code from your host to your image filesystem.
COPY . .

然后执行命令:docker build --tag bulletinboard:1.0 . 。注意最后面有个. ,表示在当前文件夹下建立Docker Image。如果忘记加的话会显示"docker build" requires exactly 1 argument

然后根据官网指引,下一个命令 docker run --publish 8000:8080 --detach --name bb bulletinboard:1.0

然后在本地浏览器访问地址:127.0.0.1:8000,便可以看到出现了一个简陋的网页。

其中,--publish 参数表示一个端口映射,规则为Docker外的端口:Docker内部的端口。比如对于这个应用,代码里规定的端口是8080,但是我们希望访问的时候用8000访问,于是通过这种方法就可以让Docker把8000端口转发到Docker内部的8000端口。而--name 参数表示一个简写名。以后要启动这个镜像就可以直接用docker start bb,停止就用docker stop bb

Image(镜像)与Container(容器)

Docker的Image是一个镜像文件,而Container则是一个该镜像文件的实例。对于同一个镜像文件,可以通过docker run命令产生多个Container 文件。可以通过docker images 命令查看当前Docker下载的镜像文件。而docker ps命令可以看到当前正在运行的容器。docker ps -a 则可以看到所有的容器,包括正在运行的和已经结束运行的。

比如我们执行了多次docker run hello-world,通过docker ps -a可以看到有多个Container对应的Image是hello-world。这些Image的name都是随机生成的。

于是按理可以通过docker start 来启动其中的某一个容器。比如其中一个容器的名字是“awesome_gauss”,输入以下命令:docker start awesome_gauss,然后只返回了awesome gauss一行字,并没有别的输出,与我们之前输入docker run hello-world 的情形不一样。

为什么会这样呢?查阅资料可知,docker start 默认是不产生命令行输出的,也就是不是交互模式运行的。如果要以交互模式运行,可以用docker start -i命令。这样之后可以看到与之前一样输出了一大串信息,开头是Hello from Docker。

创建自己的Container

通过前面官方教程的学习,我决定自己创建一个基于ubuntu镜像的容器。于是Dockerfile如下:

FROM ubuntu
WORKDIR /home/zf
CMD ["python", "print('hello from ubuntu')"]

然后执行命令:docker build --tag ubuntu-hello:0.0 .。于是显示镜像创建成功。

再输入命令docker run --name uh -i ubuntu-hello:0.0 (注意镜像名要在最后面)。结果显示

OCI runtime failed … “exec \“python\””: executable file not found in $PATH" unkown

于是猜测ubuntu中没有自带python,把CMD中用python打印改成echo,然后先

docker rm uh 删除运行过的容器,在docker rmi ubuntu-hello:0.0 删除镜像,再重新build,run,便可以正常运行了。

也可以直接通过docker run -t ubuntu 来运行ubuntu镜像。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章