Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to expose port from host to container in Docker?

Tags:

docker

You can use EXPOSE in Docker for:

The EXPOSE instructions informs Docker that the container will listen on the specified network ports at runtime.

Can I do the opposite? Can I expose port from my Ubuntu to the docker container?

Background: I'm trying to setup a simple php7-fpm as a docker image and I would like to expose port 3306 (MySQL service) to the docker container.

My Dockerfile:

FROM debian:jessie

# persistent / runtime deps
RUN apt-get update && apt-get install -y ca-certificates curl libpcre3 librecode0 libsqlite3-0 libxml2 --no-install-recommends && rm -r /var/lib/apt/lists/*

# phpize deps
RUN apt-get update && apt-get install -y autoconf file g++ gcc libc-dev make pkg-config re2c --no-install-recommends && rm -r /var/lib/apt/lists/*

ENV PHP_INI_DIR /usr/local/etc/php
RUN mkdir -p $PHP_INI_DIR/conf.d

##<autogenerated>##
ENV PHP_EXTRA_CONFIGURE_ARGS --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data
##</autogenerated>##

ENV PHP_VERSION 7.0.0RC2

# --enable-mysqlnd is included below because it's harder to compile after the fact the extensions are (since it's a plugin for several extensions, not an extension in itself)
RUN buildDeps=" \
        $PHP_EXTRA_BUILD_DEPS \
        libcurl4-openssl-dev \
        libpcre3-dev \
        libreadline6-dev \
        librecode-dev \
        libsqlite3-dev \
        libssl-dev \
        libxml2-dev \
        xz-utils \
    " \
    && set -x \
    && apt-get update && apt-get install -y $buildDeps --no-install-recommends && rm -rf /var/lib/apt/lists/* \
    && curl -SL "https://downloads.php.net/~ab/php-$PHP_VERSION.tar.xz" -o php.tar.xz \
    && mkdir -p /usr/src/php \
    && tar -xof php.tar.xz -C /usr/src/php --strip-components=1 \
    && rm php.tar.xz* \
    && cd /usr/src/php \
    && ./configure \
        --with-config-file-path="$PHP_INI_DIR" \
        --with-config-file-scan-dir="$PHP_INI_DIR/conf.d" \
        $PHP_EXTRA_CONFIGURE_ARGS \
        --disable-cgi \
        --enable-mysqlnd \
        --with-pdo-mysql \
        --enable-mbstring \
        --with-curl \       
        --with-openssl \
        --with-pcre \
        --with-readline \
        --with-recode \
        --with-zlib \
    && make -j"$(nproc)" \
    && make install \
    && { find /usr/local/bin /usr/local/sbin -type f -executable -exec strip --strip-all '{}' + || true; } \
    && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false -o APT::AutoRemove::SuggestsImportant=false $buildDeps \
    && make clean

COPY docker-php-ext-* /usr/local/bin/

##<autogenerated>##
WORKDIR /var/www/html
COPY php-fpm.conf /usr/local/etc/

EXPOSE 9000
CMD ["php-fpm"]
##</autogenerated>## 

This is the command I use to run my container:

docker run --name=php7-fpm -v /var/www/html/:/var/www/html/ -p 9002:9000 marty/php7

My PHP app database configuration:

database:
    main:
        host: 127.0.0.1
        dbname: edu
        user: root
        password: myPassword
        port: 3306
like image 366
Martin Vseticka Avatar asked Oct 01 '15 06:10

Martin Vseticka


People also ask

How do you expose a Docker container port?

Need of exposing ports. In order to make a port available to services outside of Docker, or to Docker containers which are not connected to the container's network, we can use the -P or -p flag. This creates a firewall rule which maps a container port to a port on the Docker host to the outside world.

What is exposing port in Docker?

The expose keyword in a Dockerfile tells Docker that a container listens for traffic on the specified port. So, for a container running a web server, you might add this to your Dockerfile: EXPOSE 80. This tells Docker your webserver will listen on port 80 for TCP connections since TCP is the default.

How do you expose a Docker port 22?

To expose port to your host you need to add the option: -p 22:22 to expose the port when you start running the container. To permanatly expose a port in Docker you need to edit the Dockerfile for the container and rebuild it.

Do I need to expose port in Dockerfile?

Exposing ports is optional. You publish ports using the --publish or --publish-all flag to docker run . This tells Docker which ports to open on the container's network interface.


1 Answers

You can run container with --net=host then it will have access to the host's ports directly. See https://docs.docker.com/engine/reference/run/#network-settings

like image 136
Mykola Gurov Avatar answered Oct 23 '22 04:10

Mykola Gurov