没有docker遇到的问题:
docker和虚拟机的区别:
从图中可以看到,docker比虚拟机更省内存。
流程为:你可以通过Docker Client要求Docker daemon运行某一个image,daemon就会在系统查找这个image,如果找到了就 run the container forked from that image,否则pull the image from the Docker registry and create a container from the image.
如上图所示是Docker client要求daemon: pull a Redis image、run the Ubuntu image. 这些交流是通过Docker server提供的APIs完成的。
Docker为了不同的工业需要有不同的版本,这里使用Docker community edition,简称Docker CE。
所有docker images的名字格式为<image name>:<version>
, 未指定版本号则默认为 :latest
本节用到的命令:
docker pull <images-name>:<version>
: pulls image from Docker registrydocker run <images-name>:<version>
: runs container from mentioned imagedocker ps
: shows all running containersdocker ps -a
: shows all available containersdocker exec
: executes a command in a running container解释/参数扩展 & 例子:
i
& t
are used to provide an interactive mode and a pseudo tty terminal.docker pull python:3.5
docker run python:3.5
docker ps -a
docker run -it python:3.5 bash
docker exec -it 019d4fffb3b3 bash
exit
本节用到的命令: change and commit
docker start <container_id/name>
: 重启关掉的containerdocker exec -it <cantainer id/name> bash
docker rm <container_id/name>
: 删除某个containerdocker commit -m "<commit message>" <container_id/name> <new_image_name>:<version>
: commit the containerdocker images
: see the images on your system.把image push到 Docker Hub 的步骤:
docker login
docker tag <image_name> <your_docker_hub_username>/<image>:<version>
docker push <your_docker_hub_username>/<image>:<version>
尽管Docke共享操作系统的内核,但文件系统是分开的。共享文件有两种方法,一种是Bind mount,效果类似于软链接,可以使container访问主机的文件;另一种是Volumes,它是创建在Docker中的空间,通过Docker CLI访问,更多的用于不同的container共享文件的场景,而非主机和container共享文件。
本节用到的命令:
docker volume --help
: to get the volume helpdocker volume create (<volume_name>)
: to create a new volumedocker volume inspect <volume_name>
: to inspect the created volumedocker run -v
: to mount a volume解释/参数扩展 & 例子:
ro
flag.# docker run -it -v <absolute_path>:<folder path or new folder name> date_project:1.0
docker run -it -v /root/learn/dockerlearn/:/desktop date_project:1.0
# docker run -it -v <absolute_path>:<folder path or new folder name>:ro date_project:1.0
docker volume create project_directory
docker volume ls
docker volume inspect project_directory
docker run -it -v project_directory:/project date_project:1.0
docker run -it -v project_directory:/project_in_second --name second_container date_project:1.0
flask应用案例,文件结构如下
.flaskenv文件内容如下
FLASK_APP=app.py
FLASK_ENV=development # debug模式
# FLASK_ENV=production
dockerfile一行一个命令。常见的命令如下:
COPY SOURCE DESTINATION
,拷贝文件更多命令可参考:https://docs.docker.com/engine/reference/builder/#run
dockerfile示例:
FROM python:3.9-rc-buster
# Setting up Docker environment
WORKDIR /code
# Export env variables.
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
###
#Copy requirements file from current directory to file in
#containers code directory we have just created.
COPY requirements.txt requirements.txt
#Run and install all required modules in container
RUN pip3 install -r requirements.txt
#Copy current directory files to containers code directory
COPY . .
#RUN app.
CMD ["flask", "run"]
构建image
# 进入Dockerfile所在路径后运行
docker build -t flask_app:1.0 .
构建完后会在本机上创建一个image,可以使用docker images
查看。
运行:docker run -p 5000:5000 flask_app:1.0
,如果不加-p 5000:5000
的话app会运行在container的5000端口,主机的浏览器是无法访问的,添加这个参数之后,会进行端口映射,主机的浏览器就可以访问了。
当你写代码的时候,是主机的文件发生了变化,如果你想把这些变化映射到container中,则需要在运行docker时使用docker run -it -v <host_absolute_path>:<folder path in container> -p 5000:5000 flask_app:1.0
。后台运行container,使用-d
选项,即docker run -d -v <path_to_code_directory>:/code -p 5000:5000 flask_app:1.0
。
使用docker ps
可以查看container是否在后台运行。